¿Sigue siendo útil LISP en el mundo de hoy? ¿Qué versión es la más utilizada?


117

Trato de enseñarme un nuevo lenguaje de programación en intervalos regulares de tiempo. Recientemente, he leído cómo Lisp y sus dialectos están en el extremo opuesto completo del espectro de lenguajes como C / C ++, lo que me hizo sentir la curiosidad de saber más al respecto. Sin embargo, dos cosas no están claras para mí, y estoy buscando orientación sobre ellas:

  1. ¿Todavía se practica / usa LISP en el mundo de hoy, o es un lenguaje heredado como FORTRAN / COBOL? Quiero decir, además de mantener el código existente, ¿se usa en proyectos nuevos?

  2. ¿Cuál es el dialecto más utilizado? Me encontré con Scheme y Common Lisp como los 2 dialectos más frecuentes, y quería tu opinión sobre cuál es el más favorecido / útil para aprender, y me agradaría enormemente si puedes sugerir cualquier recurso para que un principiante comience.

Si bien estoy ansioso por aprender un idioma que es fundamentalmente diferente de los lenguajes de procedimiento a los que estoy acostumbrado, no quiero invertir un esfuerzo indebido en algo si es totalmente obsoleto; todavía lo aprendería si estuviera profesionalmente "muerto", pero solo con una perspectiva académica ...


10
Estoy muy interesado en esta pregunta. De vez en cuando, cuando tengo tiempo, decido intentar aprender Lisp. Y cada vez que estoy frustrado por el mismo tipo de preguntas e incertidumbres que me preguntas aquí. ¿Qué versión de Lisp debería aprender? ¿Alguien (además de Paul Graham) realmente usa Lisp? ¿Debo aprender Lisp, o uno de los nuevos lenguajes de programación funcional como Haskell? ¿Cuáles son los beneficios de Lisp sobre Scheme, etc., etc.
Channel72



"todavía"? (
Bromeo

Acabo de encontrar este otro hilo relacionado en SO: stackoverflow.com/q/1614724/212942
TCSGrad

Respuestas:


59

Prefiero Scheme, si quieres trabajar con la JVM deberías consultar Clojure, que es un lisp diseñado para funcionar en la JVM. ¡Y sí, Lisp todavía vale la pena aprender a ver cuán poderoso puede ser un diseño tan minimalista! La gente que creó lisp hizo algunas cosas realmente bien. ¡Es sorprendente cuántas de las nuevas y geniales características de los idiomas modernos tenía lisp en la década de 1960!

Para un esquema embebido intente engaño: http://www.gnu.org/s/guile/


¿Hay un dialecto que funcione bien con C / C ++, porque soy principalmente un tipo de C ++? ¿Podría mencionar también algunos recursos para un principiante de rango, para comenzar a aprender ese dialecto?
TCSGrad

10
Los mejores libros para aprender esquemas son "The Little Schemer" y "SICP" mitpress.mit.edu/sicp . Hay una serie de implementaciones de esquemas que se pueden incrustar dentro de c / c ++, pero realmente no sé cuáles son buenas en estos días, por lo que es posible que tenga que buscar en Google.
Zachary K

1
Debo señalar que el esquema es muy simple! aprenderás aproximadamente el 90% del idioma en 2 horas. Por supuesto, eso no significa que lo habrá dominado, solo sabrá cómo funciona la sintaxis.
Zachary K

55
@ shan23 Scheme fue diseñado para la enseñanza. Sin duda, podría usarse para enseñar a un estudiante de primer año cómo programar, así que no tengo dudas de que no tendrá problemas para aprenderlo. Si desea la integración de C o C ++, consulte Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Vitor Py

1
El libro de lenguaje de programación Scheme de Kent Dybvig no es tan famoso quizás, pero es un libro muy bueno. scheme.com/tspl4 Si usa Emacs, aprender algo de Lisp es útil.
blispr

68

En respuesta a la pregunta 2, "Dialecto más utilizado":

Depende de cómo interpretes "Más utilizado". Aquí hay algunos cálculos matemáticos de servilletas para los límites inferiores sobre cuánto uso tiene cada uno de los pocos dialectos elegidos.

La mayoría del código en bruto escrito

  • Posiblemente Esquema (todos los dialectos) debido a aplicaciones educativas
    • 270 escuelas ... Supongamos 50 estudiantes / año, 500 líneas de código / estudiante, 10 años consecutivos. 1,000,000+ líneas basadas en matemática de servilletas.
    • 500,000 líneas de Racket en Racket y sus herramientas.
  • Posiblemente Lisp común debido a la IA y una gran cantidad de código fuente abierto y código de producción (Ver código de producción).
  • Posiblemente Emacs Lisp debido a ...
    • Emacs en sí: más de 1,000,000 de líneas
    • La cantidad de Emacs Lisp escrito públicamente - 237 módulos, alrededor de 200 líneas / módulos es de 40.000 líneas sólo en EmacsWiki, probablemente mucho más en ELPA
    • Más aplicaciones escritas en emacs Lisp, archivos .emacs, etc.
  • Clojure
    • Difícil de estimar. Mayormente dotcoms más pequeños. Podría ser mucho

Ganador: Esquema o Common Lisp. Demasiadas incógnitas.

La mayoría del código de 'producción'

Ganador: supongo que Common Lisp . Creo que podemos responder "Sí" a la pregunta 1 según el uso de Common Lisp y Clojure.

La mayoría de los usuarios finales

  • Lisp común
    • Clientes de ITA Software, incluidos Orbitz, Bing Travel y Kayak.com: probablemente millones.
  • Clojure
    • Citigroup (sin detalles), Akamai (sin detalles), simple.com, muchos otros. Probablemente millones.
  • Esquema
    • Estudiantes de CS, investigadores y aficionados. Menos de un bazillion.
    • La serie Uncharted: más de 5 millones
  • Emacs Lisp: principalmente programadores, principalmente en plataformas Unix. Podría ser un millón.

Ganador: Scheme tiene el mejor límite inferior aquí, ya que hay números de ventas en Uncharted, pero es bastante discutible.

Conclusión

En conclusión, me parece que las manzanas grandes.


44
¿No son naranjas pequeñas? ¿O limones purpreen?
Vatine

De hecho, el esquema, especialmente el esquema de la raqueta, parece ser el dialecto de ceceo más actualizado. Un profesional de herramientas y bibliotecas de grado.
Bikal Lem

@Bikal Ojalá el soporte de OpenGL no estuviera tan anticuado, pero el modo directo no es el mayor error de mi código Racket ...
Jesse Millikan

No tenía idea de que Orbitz usaba CL ... Sé dónde buscar mi próximo trabajo: D
Rig

2
Se han escrito más de 100k LOC en Racket. La biblioteca / IDE / herramientas estándar de Racket tiene más de 500k, además está en uso en compañías como SET, Boeing y Naughty Dog.
Sam Tobin-Hochstadt

43

¿Todavía se practica / usa LISP en el mundo de hoy, o es un lenguaje heredado?

Sí, lo es, pero tienes que saber dónde buscar. Las personas que usan LISP no tienden a gritar demasiado alto al respecto, pero hay algunos ejemplos de algunas nuevas empresas de alto perfil que lo han usado con gran efecto en los últimos 20 años. También es muy popular entre las pequeñas empresas en Europa.

¿Cuál es el dialecto más utilizado?

Esta es una pregunta válida, pero no es fácil de responder. También puede no ser particularmente útil para responder: muchas implementaciones tienen un enfoque específico, por lo que es mejor elegirlas si se ajustan a su problema particular en lugar de basarse en qué tan ampliamente se usa. En cambio, te contaré un poco sobre tus opciones y puedes decidir por ti mismo.

LISP es una familia de idiomas y cada uno de esos idiomas tiene una familia de dialectos e implementaciones. En general, los dialectos se dividen en dos campos: "LISP" y "Esquemas".

LISP: hasta hace relativamente poco, Common LISP era el rey. Fue un intento de unificar todos los LISP dispares y, sin ser cruel, fue el "C ++" de LISP. Es decir, era un lenguaje ENORME . Lo tenia todo. En los últimos años, Clojure ha aparecido. Clojure es un LISP que se ejecuta en la máquina virtual Java e intenta arraigarse en una filosofía de programación funcional. Tradicionalmente, otros LISP han sido estrictamente multi-paradigmáticos. Clojure es interesante porque obtiene lo mejor y lo peor de LISP y JVM. Todavía hay mucha verbosidad de los lenguajes basados ​​en Java y han sido bastante gratuitos y fáciles con la sintaxis, por lo que tienen muchos botones y botones para diferentes cosas, pero realmente tienen algunosideas interesantes sobre los tipos de datos, especialmente algunas de las formas prácticas que se les ocurrieron para aplicar ideas desde la programación funcional.

Esquemas: los esquemas son un subconjunto estricto de LISP. El esquema fue inventado por Steele y Sussman y en la vida temprana fue notable por ser utilizado en el curso de conferencias 101 de informática del MIT. El esquema se define en el "Informe revisado ^ n sobre el esquema de lenguaje algorítmico (RnRS)". Sí: tienen una broma de matemáticas allí. Scheme es un lenguaje estandarizado de una manera que otros LISP no lo son. Esto ayuda mucho con la portabilidad entre implementaciones, pero no es una bala de plata. Los esfuerzos de estandarización han tendido a ser conservadores y las innovaciones en las implementaciones, especialmente en torno a cosas como los módulos, han tendido a ser dispares. También hay una serie de SRFI (Solicitudes de esquema para implementación) que es similar al proceso RFC del IETF. La gente lo usa para estandarizar cosas pequeñas según sea necesario.

Los esquemas son diferentes de los LISP porque tienen un conjunto de requisitos estrictos que deben cumplir, uno de los cuales es la "optimización de la llamada de cola", que ayuda a que la recursividad sea eficiente. Por lo tanto, los estilos recursivos de programación son mucho más populares en Scheme que en LISP. Scheme es, también sin ser cruel, como la "C" de LISP. Es decir, es un lenguaje pequeño y se supone que puedes tenerlo todo en tu cabeza a la vez.

Actualmente hay dos familias de esquemas: las basadas en la quinta versión (R5RS) y las basadas en la sexta versión (R6RS). La complejidad de R6RS fue mucho mayor que la de cualquiera de sus predecesores y muchas implementaciones de R5RS han optado por omitirlo, con la esperanza de que R7RS sea más similar a R5RS que R6RS. El proceso de estandarización de R7RS está actualmente en curso y ha tratado de incluir tanto los deseos de los implementadores de R5RS como los de la gente de R6RS estandarizando un pequeño lenguaje base en su primer grupo de trabajo y luego comisionando a un segundo grupo de trabajo para estandarizar las características más grandes. Esto permitirá que el lenguaje tenga implementaciones eficientes y útiles tanto en hardware embebido pequeño como en máquinas más capaces.

Ahora seré más específico:

PicoLisp es un LISP realmente genial. Es pequeño! Su autor lo escribió para sí mismo y, según tengo entendido, se ha ganado la vida desde la década de 1980. Si alguna vez tienes la oportunidad de asistir a una charla de él, entonces debes hacerlo: es realmente interesante y realmente sabe lo que hace y no obtendrás ni el más mínimo olfato de nada convencional o aburrido.

No estoy familiarizado con las implementaciones de Common Lisp, así que no comentaré más sobre ellas.

Guile es el esquema oficial de GNU.

Racket es un esquema R6RS pero últimamente parece haber ampliado la red y está tratando de "servir como plataforma para la creación, diseño e implementación del lenguaje".

Chicken pretende ser un esquema práctico. Se basa en R5RS y se compila en C. Esto resulta ser una ventaja muy, muy importante, ya que hace que sea absolutamente trivial usar bibliotecas C existentes. Por lo tanto, Chicken es probablemente el esquema más útil para reemplazar Perl, Python, Ruby, etc., como su lenguaje de programación diario. Hay varias personas que lo han usado exclusivamente para todas sus necesidades durante varios años. Tiene un REPL interactivo así como un compilador. La comunidad (tanto en la lista de correo como en IRC) está bien informada, es amigable y servicial.

Busque una implementación con muchos módulos: esto muestra que es ampliamente utilizable y significa que es probable que tenga algo que ayude con la tarea en cuestión.

Busque una implementación con un compilador o, al menos, algo que no esté estrictamente basado en IDE o REPL. Muchas de las implementaciones diseñadas para la enseñanza son muy difíciles de usar para secuencias de comandos de propósito general.

Recomiendo Chicken, ya que es lo que uso. Lo he usado en mis proyectos personales y lo he usado (y actualmente lo estoy usando) profesionalmente.

No quiero invertir un esfuerzo indebido en algo si es totalmente obsoleto; aún así lo aprendería si estuviera profesionalmente "muerto", pero solo con una perspectiva académica ...

Scheme no está profesionalmente muerto, pero es posible que tenga que hacer todo lo posible para usarlo en ese contexto. Algo como Chicken es mucho más que una búsqueda académica y puede cubrir fácilmente casi todas las bases de los idiomas de alto nivel que utiliza actualmente.


3
Racket no es un esquema R6RS; Hay uno entre los idiomas que proporciona la distribución Racket. El lenguaje real de Racket es un esquema que se aleja de RnRS de varias maneras importantes (sobre las cuales tengo sentimientos encontrados).
JasonFruit

27

Realmente no puedo hablar por todos los Lisps, pero Clojure es definitivamente un lenguaje candente y relevante en la actualidad. Un grupo de usuarios de Londres Clojure al que fui a principios de esta semana tenía más de 100 asistentes ...

Descubrí que es una experiencia muy esclarecedora aprender Lisp en forma de Clojure durante el año pasado (después de mucha experiencia con Java y C #). Las razones principales para esto son:

  • Tiene un énfasis bastante fuerte en la programación funcional (más que la mayoría de los demás Lisps). El autor y BDFL Rich Hickey ha citado frecuentemente a Haskell como una de sus inspiraciones para el diseño del lenguaje, lo que significa que obtienes cosas como estructuras de datos totalmente inmutables y secuencias infinitas perezosas, etc.
  • Metaprogramación macro : la filosofía "código es datos" de Lisp es difícil de entender a menos que realmente la hayas experimentado, pero es una de las razones por las que Lisps es tan expresivo y productivo
  • Fantástico soporte para la concurrencia multinúcleo : en realidad creo que Clojure es el mejor lenguaje para la programación concurrente en este momento. Ver http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey para una presentación esclarecedora sobre esto

También parece ser una opción práctica para el uso real de producción por las siguientes razones:

  • Ejecutar en la JVM con una interoperabilidad Java muy fácil le da acceso a todas las bibliotecas y herramientas en el ecosistema Java
  • Es un lenguaje dinámico por defecto, lo que lo hace muy conveniente para el desarrollo y la creación rápida de prototipos con casi ningún estándar. Sin embargo, puede agregar sugerencias de tipo estático para obtener un rendimiento bastante bueno donde lo necesite.

Personalmente, sé de personas que usan Clojure en un par de bancos de inversión y nuevas empresas. También elegí Clojure como el lenguaje de desarrollo principal para mi propia startup, así que estoy dispuesto a poner mi dinero donde está mi boca :-)


9

Actualmente también estoy aprendiendo Lisp (y me encanta). Uso Common Lisp pero también me he metido con SBCL , Arc (nota, esa es la versión de Lisp de Paul Graham que, como lo mencionó Vitor Braga creó Yahoo store / Viaweb) y Allegro CL, que es similar a Visual Studio para Lisp (puede crear GUI, sin embargo, nunca lo he usado).

En cuanto a los usos, Lisp se ha utilizado mucho en Inteligencia Artificial, pero seré sincero, no estoy seguro de cuántos otros usos "generales" para Lisp. Muchos de los sitios web que se crearon en Lisp originalmente se han reescrito en otros idiomas, por lo que es difícil decir que se usa en el desarrollo web (sin decir que no, pero los sitios más grandes que lo usan ya no lo hacen). ) Después de hacer una búsqueda rápida (muy rápida) aquí hay una lista de software escrito en Common Lisp de Wikipedia .

[EDITAR] En cuanto a usar Lisp profesionalmente, hay trabajos que te obligarían a usar Lisp. No son tan numerosos como, por ejemplo, trabajos de Java o C #, pero existen. Creo que Lisp es uno de esos lenguajes que se usa para aplicaciones internas y puede proporcionar una ventaja competitiva que las empresas no quieren renunciar al anunciar que usan Lisp. Recuerdo haber visto una publicación en P.SE que decía que Smalltalk era similar en el ámbito financiero.

Además, ser capaz de demostrar que puede aprender diferentes paradigmas puede abrir más puertas incluso si no usa Lisp en el trabajo.

"Vale la pena aprender a Lisp por la profunda experiencia de iluminación que tendrás cuando finalmente la obtengas; esa experiencia te convertirá en un mejor programador para el resto de tus días, incluso si nunca utilizas mucho Lisp". - Eric Raymond, "Cómo convertirse en un hacker"

[/EDITAR]


77
FWIW, SBCL es una implementación de Common Lisp y también lo es Allegro CL.
Vatine

@Vatine: estarías en lo correcto. Si hubiera una cara sonrojada, lo lograría ahora. No sé por qué supuse que eran diferentes. Estúpido me compilador diferente! = Dialecto diferente :) ¡Gracias!
Jetti

@Jeff: Bueno, ambos extienden el lenguaje en diferentes direcciones, mientras dejan el interoperable "CL core".
Vatine

@Jetti ¿Qué estabas usando en primer lugar?
Mark C

Creo que estaba usando CLISP, estaba en una imagen de VM que ya no tengo. Creo que mi ignorancia me hizo creer que era un ceceo común. Al menos ahora lo sé mejor.
Jetti

8

Si quieres aprender Lisp hoy, echaré un vistazo a cualquiera de las raquetas, que es una implementación rápida del esquema (bueno, en realidad se alejó un poco del esquema, por lo que ahora es su propio dialecto) o clojure, que se beneficia de la JVM se ejecuta (por lo que hay disponibles miles de millones de bibliotecas, además puede hacer que interactúe con su propio código Java).

Incluso si no aprende a usarlo, aprenderlo siempre es beneficioso: aprende nuevas formas de pensar y lidiar con los problemas, incluso en otros idiomas, una vez que haya pensado en Lisp por un tiempo.


3
El problema con Scheme es que cuando comienzas a practicarlo, no quieres volver a otros idiomas. Acabo de empezar a implementar secuencias (posiblemente infinitas, evaluadas perezosamente, secuencias inmutables) en C ++ y ¡eso es mucho más código que en Scheme! Realmente me sorprendió la combinación de simplicidad y poder de Scheme.
Giorgio

++ para raqueta. Realmente es increíblemente COMPLETO, que es una de las críticas de otros esquemas. Y va más allá de lo que el esquema puede hacer con respecto a la creación de sus propios idiomas.
Scott Klarenbach

7

Una parte importante del backend de Amazon solía estar en Lisp, pero ahora se reescribió en C ++, o eso he oído (debo admitir que no tengo una fuente confiable para esto).

Yahoo! Stores es uno de los ejemplos clásicos de aplicaciones web de Lisp. De Yahoo! Almacena la fama que quizás hayas oído hablar de Paul Graham . Graham es uno de los defensores más conocidos de Lisp y escribe extensamente sobre este tema. Es posible que desee leer su sitio para conocer sus puntos.

AutoCAD solía tener un dialecto Lisp para su sistema macro. No sé si aún lo hace.

Scheme es un lenguaje limpio y muy elegante. Probablemente sea mi lenguaje de programación favorito, por lo que puedo estar sesgado. Si iba a escribir en este momento una aplicación importante, probablemente escribiría una aplicación esqueleto en C, ampliaría y definiría las reglas de negocio en Scheme. Esto me permite usar Scheme y aprovechar C, para la velocidad y la gran disponibilidad de bibliotecas para casi todo.


¿Qué recomendarías como libro / compilador inicial para Scheme? Yo uso Linux, así que si hay algún editor que sea explícitamente útil para los novatos (como Kile es para LaTex), hágamelo saber ...
TCSGrad

1
@ shan23 The Little Schemer ( ccs.neu.edu/home/matthias/BTLS ) es su mejor apuesta. Creo que emacs es el editor más común para Scheme, pero lleva un tiempo acostumbrarse a él.
Vitor Py

1
Editor para lisp, eso es fácil, usa emacs. Fue escrito por lisp guys y en lisp.
Zachary K

También puede usar el IDE Racket ( racket-lang.org ); es similar a Emacs pero tiene formato automático e interacción con el intérprete de Scheme.
Jeremiah Willcock

Lispbox ( common-lisp.net/project/lispbox ) funciona fuera de la caja (es útil alguna experiencia con emacs). Está basado en ccl ( ccl.clozure.com ), vea también gigamonkeys.com/book/…
Giorgio

4

¿Todavía se practica / usa LISP en el mundo de hoy, o es un lenguaje heredado como FORTRAN / COBOL? Quiero decir, además de mantener el código existente, ¿se usa en proyectos nuevos?

Conozco a varios tipos que hacen Lisps en algunas startups en Silicon Valley, y sé que Amazon.com ha estado usando Lisp desde el principio (¿aunque he oído que lo están reemplazando con C ++ por alguna razón?)

Pero una compañía a tener en cuenta es Naughty Dog . Todos sus juegos están escritos con un dialecto Lisp. Originalmente, rodaron los suyos, pero usan MZScheme en la serie Uncharted.

¿Cuál es el dialecto más utilizado? Me encontré con Scheme y Common Lisp como los 2 dialectos más frecuentes, y quería tu opinión sobre cuál es el más favorecido / útil para aprender, y me agradaría enormemente si puedes sugerir cualquier recurso para que un principiante comience.

Apostaría a que Common Lisp, Clojure, Scheme y Emacs Lisp son los cuatro dialectos más utilizados, y sospecho que Scheme es el más comúnmente implementado. No tengo nada para respaldar esto, por supuesto. :)

Prefiero SICP y Little Schemer, como lo sugirieron otros, pero también sugeriría Land of Lisp , que es una lectura bastante entretenida. :)


De hecho, Land of Lisp es una lectura increíble.
Chiron

@ 4bu3li ¿No tienes voto?
Mark C

1
Acerca de Naughty Dog: Eso no es del todo correcto, sus juegos de PS2 fueron escritos en GOAL, un lenguaje similar al lisp ... Pero desde que se mudaron a la PS3, han cambiado a usar C ++. MZScheme se usa principalmente como un preprocesador de macros, escrito en línea con C ++, y se usa para el procesamiento de algunos activos, y algunos de sus scripts se escriben en S-exps. Pero ningún código MZScheme realmente se ejecuta en la PS3.
Arelius

2

Creo que depende en parte de lo que quiera hacer con él: si está buscando profundizar sus conocimientos sobre los diversos conceptos de programación y convertirse en un mejor programador, entonces diría que vale la pena aprender al menos un poco de Lisp. Si está buscando otro idioma para agregar a su currículum con el fin de conseguir un trabajo que funcione con este idioma, probablemente desee buscar en otro lado. No hay tantos trabajos de Lisp por ahí.

Personalmente trato de usar SBCL o más recientemente, Clojure (y algunos Emacs Lisp, pero htat porque soy un usuario de Emacs a largo plazo; intentaría aprender Emacs Lisp cuando intento aprender Lisp). Ahora todo lo que necesito hacer es encontrar el tiempo para jugar con esos idiomas ...


1
Es principalmente el primero ... ya que es bastante evidente que si tengo éxito en eso, ciertamente no dañará mi currículum en absoluto :). Pero en serio, quiero una perspectiva sobre los diferentes "estilos" de programación, de modo que tenga una buena idea de cuál usar en diferentes escenarios (no quiero caer en la situación de que estar equipado solo con un martillo, ¡Tengo que tratar todos los problemas como uñas!)
TCSGrad

2

No sé si hay un montón de trabajos en LISP, ciertamente no puedo verlos. Pero sí recuerdo haber leído mucho tiempo acerca de una sonda de la NASA en la que ejecutaban LISP y podían insertar un nuevo código de la Tierra.

También en Nueva York el grupo de reunión de clojure es enorme. Supongo que si está interesado e ir a su grupo de reunión de clojure, puede encontrar oportunidades para establecer contactos y encontrar trabajos (no trabajos de clojure, sino cosas como Java / C ++ / etc.). Parece ser absolutamente enorme en el área de Nueva York, otras áreas pueden variar.

También LISP es una forma diferente de pensar. Además, LISP y SQL resultan en el uso de toneladas de expresiones anidadas. Usé SQL una tonelada y luego noté que LISP tenía más sentido. Pero si tiene problemas con SQL para acostumbrarse a paréntesis y expresiones super anidadas mientras usa LISP, probablemente hará que las expresiones SQL sean mucho más fáciles de entender.

Un ejemplo clásico es cómo implementar MAX (a, b, c). Podría hacer una función enrevesada con un montón de sentencias if. O simplemente podrías decir

MAX (MAX (a, b), c)

y use dos llamadas anidadas simples de los dos elementos MAX, que para mí es más fácil de leer. Aunque si el rendimiento es un problema, es posible que también desee hacerlo de otra manera, no me molesté en contar el número de comparaciones al usar cada método ... También si está implementando MAX a través de una macro C u otro método que evalúa el expresiones múltiples veces puede que no obtenga el resultado esperado ya que la expresión puede evaluarse varias veces, así que tenga cuidado con los efectos secundarios ...


3
En realidad, puedes simplificar MAXMAX(MAX(a b) c)
Andrea

Tienes razón, eso es lo que obtengo por responder poco después de despertar. Ajusté la respuesta.
Cervo

2
El proyecto de la NASA fue Deep Space 1: flownet.com/gat/jpl-lisp.html
Frank Shearar

2

Dos puntos adicionales:

Primero, Lisp es un gran lenguaje para escribir código en el que las interacciones entre funciones o datos son a menudo complejas. En muchos idiomas populares, si está confundido acerca de por qué su programa está haciendo lo que está haciendo, debe escribir funciones especiales que le permitan examinar el estado interno del programa a medida que avanza. En algunos idiomas, debe esperar a que se recompile su código. Por supuesto, puede haber herramientas como depuradores que ayuden con esto. Sin embargo, en Lisp, todo lo que necesita es una forma de detener el programa, y ​​luego, por lo general, tiene acceso a todo en Lisp. En Common Lisp, a veces solo escribo ^ C, o llamo aerroren una sola función (que es lo único que debe ser recompilado, y no tiene que hacer nada para recompilarlo). Una vez que detengo el programa, soy arrojado instantáneamente a un depurador, pero el depurador me da todo el poder de Lisp, y puedo salir del depurador, llamar a funciones específicas, etc. Puedo examinar fácilmente cualquiera de las estructuras de datos en mi programa La mayoría de los esquemas deberían permitir prácticas similares. Lisp no es único en este sentido, pero lo que ofrece va más allá de lo que ofrecen muchos idiomas populares.

Segundo: si vas a experimentar con cualquier dialecto de Lisp, no lo haría sin (a) usar un editor que coincida con paréntesis, y (b) aprender la sangría adecuada de Lisp. Sería una buena idea utilizar un editor que también se aproxime a la sangría adecuada para usted. El formato de código C / C ++ / estilo Java está diseñado para idiomas con menos paréntesis / llaves / corchetes que Lisp. El estilo de impresión bonito de Lisp funciona bien una vez que está familiarizado con él, y no termina confundido por paréntesis ni pierde la mitad de su espacio poniendo un paréntesis de cierre por línea.


1

En este momento tengo la impresión de que Lisp se usa principalmente en tiendas de consultoría (no que las tiendas de consultoría lo usen principalmente).

Se considera un poco extraño para el software práctico. Sobre todo porque la gente no está acostumbrada, creo.

Tradicionalmente, Scheme es un dialecto bastante académico de Lisp, y Common Lisp era el dialecto de la industria.

Lisp es particularmente útil para la manipulación simbólica y las capacidades de reflexión.

Como ejemplo, el código que escribí para aprender Lisp era un programa que construía funciones lambda aleatorias, las evaluaba y luego las operaba, en un intento de minimizar la diferencia de la función con una función objetivo. Todo eso fue manipulación directa. En un lenguaje como C ++ o Java, habría tenido que inventar una representación para las funciones que la computadora manipularía.


Punto interesante que hizo sobre las diferencias entre Scheme / Common Lisp: ¿podría explicar el por qué / cómo?
TCSGrad


1

Me gustaría agregar una perspectiva sobre Common Lisp y Scheme. He evitado clojure debido a la JVM, así que no tengo mucha perspectiva al respecto.

Scheme es un lenguaje hermoso, conciso y bien definido. Tomó muchas decisiones que CL tuvo que tomar debido al legado, y tomó el enfoque más puro. Por ejemplo, las variables y funciones están en el mismo espacio de nombres. El lenguaje predeterminado es más pequeño y conciso, lo que funciona bien para enseñarle el tipo de cosas en las que es bueno el lisp, por ejemplo, presiona el uso de la recursión en lugar de la iteración, ya que de forma predeterminada no tiene bucles iterativos y requiere la optimización de la cola de llamadas . Scheme tiene un macro sistema higiénico muy interesante, que tiene mucho valor para el aprendizaje. Pero en mi opinión, recomendaría aprender primero macros antihigiénicos de estilo CL, de los cuales la mayoría de los dialectos de esquema (?) Ofrecen al menos una implementación, incluso si no es parte de la especificación. Ya que parece que quieres aprender un idioma para aprender, yo '

Dicho esto, la comunidad de Scheme está fragmentada y, aparte de unos pocos bolsillos pequeños, parece estar principalmente dedicada a la investigación sobre cómo hacer un trabajo real ... Por ejemplo, cada dialecto tiene su propio administrador de paquetes, y los paquetes a menudo no son portátiles a través de dialectos, lo cual es un gran problema en la comunidad del esquema.

Common Lisp, por otro lado, parece ser el enfoque mucho más pragmático para desarrollar un lenguaje. El estándar es tal que gran parte del código lisp es portátil entre implementaciones, muchos compiladores son rápidos y están bien optimizados. Hay un gran conjunto de paquetes, muchos de los cuales son portátiles entre implementaciones. Y aparentemente se está creando una cantidad (comparativamente) grande de productos reales en el lenguaje. Y con say quicklisp, su administración de paquetes se siente razonablemente cerca de lo que obtendría en una comunidad moderna como decir Ruby o Node. CL, sin embargo, no carece de defectos, tiene una especificación muy grande en este punto en comparación con el esquema, e incluso su sistema de objetos CLOS, algo que tradicionalmente se escribe como una biblioteca en Lisps, es parte de la especificación IIRC. Y puede sentir el legado arraigado a través de una gran cantidad del sistema.

De lo contrario, dije que no podía hablar en clojure, y Emacs Lisp es claramente la opción apropiada si su objetivo es escribir extensiones de Emacs, y claramente no es la opción adecuada para otro software.

TLDR; Si su objetivo es aprender, recomiendo Scheme. Sin embargo, si desea crear software, recomendaría Common Lisp de las dos principales variantes de lisp.


Por cierto, PLT Racket es un lenguaje que es más parecido a un esquema, y ​​originalmente de la comunidad de esquemas que parece estar tratando de ser útil para el trabajo real. Si tuviera que escribir código en un esquema en estos días, probablemente sería PLT o Chicken Scheme, pero esto podría deberse a un punto débil en mi corazón.
Arelius

0

Aprendí mucho de las respuestas. Gracias a todos los que contribuyeron a esta conversación esclarecedora.

Debo mencionar newLISP . Aunque difiere un poco de CL y Scheme, implementa muchas funciones muy útiles. El servidor http, la funcionalidad de procesamiento múltiple (Cilk) y las funciones de evaluación remota son muy limpias y fáciles de usar.

El único ejecutable es pequeño, rápido e incluye muchas baterías geniales.


Probablemente sea justo mencionarlo, pero no lo recomendaría exactamente ... Sin alcance léxico y sin módulos, por ejemplo, ¿en serio? Realmente no entiendo lo que newLISP está tratando de lograr.
cji

2
Tienes razón, es diferente. Utiliza contextos y alcance dinámico y, desde mi experiencia, los módulos y contextos están interrelacionados. No intenta ser otro CL ni Scheme. Leer la página sobre cómo difiere ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) arroja luz sobre los problemas de diseño. Del mismo modo, no lo recomendaría a nadie que quiera una experiencia CL o Scheme. Pero para algunos casos de uso, podría ser una opción viable. Esa es la belleza del ecosistema de código abierto: ¡muchas opciones!
CyberFonic

0

Otro factor a considerar al elegir qué dialecto de Lisp aprender puede ser el número y la calidad de las implementaciones. Si un dialecto tiene solo una o dos implementaciones, entonces estás atrapado con sus fallas hasta que esas fallas se corrijan, y siempre existe la posibilidad de que la gente deje de refinar la implementación. En sí mismo, esa no es una razón para no usar un dialecto de implementación única de Lisp, pero es algo a tener en cuenta. Una ventaja de Scheme y Common Lisp es que hay muchas implementaciones de estos dialectos. Ambos idiomas han publicado estándares, por lo que es probable que las implementaciones relativamente recientes ejecuten el mismo código, principalmente. Algunas de estas implementaciones han existido desde hace mucho tiempo, pero aún están en desarrollo activo: ahora son implementaciones de alta calidad y aún se están perfeccionando.


Bueno, de acuerdo con esos puntos de referencia, Clojure no está tan mal en comparación con SBCL: benchmarksgame.alioth.debian.org/u32/…
AndreasScheinert

Gracias Andreas Tienes razón. Muestra cuánto sé sobre la JVM, no mucho. En parte me engañó ABCL, un CL relativamente lento pero agradable basado en JVM.
Marte el

Yo diría que si quieres un Lisp en la JVM, ve por Clojure. No es perfecto, pero es un verdadero placer (en mi humilde opinión)
AndreasScheinert 03 de
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.