¿Qué dialecto de Lisp debería aprender? [cerrado]

89

Sé que hay algunos dialectos diferentes de Lisp. Habiendo decidido que aprender Lisp sería una nueva experiencia intelectual, me gustaría saber qué dialecto Lisp aprender y por qué.

¿Hay alguno que sea más popular que los demás? ¿Alguno de ellos es más "completo", mejor documentado y respaldado? ¿Cuáles son los pros y los contras de este dialecto?

Humphrey Bogart
fuente
Hice una búsqueda sobre eso antes de hacer esto, pero la naturaleza de la pregunta evolucionó a medida que la escribía. Me aseguraré de no reinventar la rueda.
Humphrey Bogart
Entonces, ¿cuál es la diferencia entre esta pregunta y la que Greg menciona arriba?
cjs
2
Creo que lo que estaba tratando de decir era: cuando formulé por primera vez mi pregunta en mi mente, era completamente diferente de la actual, y mirar las preguntas en la búsqueda relacionada no reveló ninguna que se ajustara a lo que él quería. pedir. Pero cuando escribió la pregunta, había cambiado y, por lo tanto, llegó a SO en su forma actual, que se preguntó anteriormente.
J. Polfer

Respuestas:

77

Desea buscar un equilibrio entre simplicidad y limpieza, características atractivas y una plataforma que le permita escribir software interesante y útil (para usted mismo), además de servir como herramienta de aprendizaje. (Esto último lo mantendrá activo y aprendiendo por mucho más tiempo). Aquí hay algunas posibilidades:

  1. Esquema. Probablemente el más limpio de todos los dialectos. Esta es sin duda la razón por la que The Little Schemer se tradujo de LISP a Scheme. La quinta especificación estándar de Scheme, R5RS , es una educación maravillosa en sí misma; puede ser el lenguaje y la especificación de biblioteca más agradable que he leído, así como el más corto que es razonablemente completo. La plataforma PLT Scheme (ahora Racket) incluye un intérprete y compilador bastante decente, es buena para la creación de scripts y también tiene algunas herramientas visuales que la hacen excelente para el aprendizaje.

  2. Common Lisp. Probablemente la variante más portátil y completa, esto es probablemente lo que desea si desea escribir cosas como software comercial. El estándar define bibliotecas extensas, y hay muchas más disponibles más allá de eso, tiene CLOS , que probablemente le enseñará más sobre OO que cualquier lenguaje OO, y algunos de los compiladores son muy buenos. Las desventajas incluyen algunas verrugas que Scheme no tiene (como tener un espacio de nombres separado para las variables que se refieren a funciones), no ser tan limpio y simple (como es el caso de cualquier cosa que haya tenido que tener las extensiones y hacer los compromisos necesarios para aplicaciones grandes en el mundo real), no tener macros higiénicas y enfatizar la recursividad mucho menos que Scheme.

  3. Clojure.Esto se ejecuta en la JVM, lo que puede ser una ventaja para los desarrolladores de Java. Tiene algunas verrugas (por ejemplo, debe solicitar explícitamente la optimización de la llamada de cola, aunque esto puede cambiar algún día si se agrega TCO a la JVM). Las macros, aunque no son higiénicas, tienen algunas características para ayudarlo a evitar la captura de variables, por lo que puede capturar variables si realmente lo desea, con menos riesgo de hacerlo accidentalmente que en CL. Tiene fácil acceso a todas las bibliotecas de Java; probablemente sea algo bueno para el código del "mundo real" y bastante inútil en términos de aprendizaje. Tiene un conjunto de bibliotecas para estructuras de datos persistentes y soporte para STM, lo que lo hace muy interesante desde un punto de vista concurrente; esto hace que sea probablemente su mejor apuesta si ' Está interesado en aprender más sobre los nuevos métodos para tratar la programación paralela y concurrente. Parece que Clojure es tan útil para aplicaciones de producción grandes como Java, en el sentido de que tendrá la capacidad de hacer las "cosas feas" que haces en aplicaciones de producción que preferirías no hacer y no harías. cuando estás aprendiendo.

  4. Emacs Lisp. En términos de un LISP, este no es uno de los mejores ejemplos que existen. Una de sus mayores fallas es el alcance dinámico, pero hay muchas otras. Sin embargo, si es un usuario de Emacs, esta puede ser la herramienta más poderosa que puede aprender para mejorar su uso del editor. Sin embargo, para mí es una pregunta abierta cuánto aprendería realmente al aprender Emacs Lisp, más allá de cómo extender Emacs; No sé con qué frecuencia se usan realmente en Emacs Lisp técnicas interesantes como las funciones de orden superior.

Actualización 2018

Ha pasado casi una década desde que escribí esta publicación y la familia de lenguajes Lisp ahora parece estar ganando una tracción significativa en la conciencia general del programador. Gran parte de esto parece estar relacionado con Clojure, que no solo se ha convertido en un dialecto separado de Lisp por derecho propio, presentando muchas de sus propias buenas ideas, sino que ahora tiene una versión casi idéntica dirigida a JavaScript y ha inspirado a muchos otros Lisps. dirigidas a otras plataformas. Por ejemplo, Hy apunta a CPython AST y bytecode, apuntando primero a la interoperabilidad con Python, pero usando ideas de Clojure "en caso de duda". (Aunque de las últimas confirmaciones, esta última puede estar cambiando un poco).

El gran cambio que esto trae en su proceso de toma de decisiones es que también debería estar mirando cualquier lenguaje Lisps o similar a Lisp que esté disponible e interoperar con lenguajes o plataformas que ya usa, ya sea Perl , Ruby , Erlang , Go o incluso C ++ en microcontroladores .

cjs
fuente
3
Tener espacios de nombres separados no es una verruga, es solo una decisión de diseño diferente. Tenga en cuenta que ya hay varios otros espacios de nombres también en Scheme, por lo que el debate es más bien Lisp-5 contra Lisp-6. Aparte de la conveniencia de que puedo llamar una lista "lista" y un coche "coche" en CL, su sistema de macros es mucho más práctico y útil, porque el compilador no confunde las cosas tan fácilmente.
Svante
Clojure no tiene optimización de llamadas de cola, y no puede, porque el código de bytes de JVM no lo admite. Todo lo que tiene es una forma especial "recurrente" que auto-recurre a la función actual.
Svante
3
Curt: Yo diría que Clojure es el más portátil ya que se ejecuta en Java VM.
justinhj
1
No sé sobre eso; Si excluye dispositivos pequeños e integrados (como teléfonos y tarjetas inteligentes) en los que no va a ejecutar un programa de escritorio / servidor sin modificar, elisp ciertamente se ejecuta en muchas más CPU y plataformas que la JVM.
cjs
1
Estoy totalmente en desacuerdo. La recursividad tiende a producir código que es a) más puro, b) más fácil de verificar, c) es más probable que sea correcto. Más detalladamente: a) tiende menos a tocar menos variables fuera de la función; b) una prueba inductiva tiende a desaparecer naturalmente de la función recursiva, mientras que con los bucles es necesario comprobar las invariantes del bucle, etc .; c) la confiabilidad proviene de a) y que tiende a ser empujado al código de una manera que naturalmente lo hace hacer (quizás informalmente) la prueba inductiva de b).
cjs
22

Yo diría Scheme, únicamente por el Little Schemer , que es uno de los libros más increíblemente divertidos pero extremadamente difíciles que he intentado leer.

J. Polfer
fuente
15
¡No olvide SICP! mitpress.mit.edu/sicp . Esta es una lectura clásica.
Joris Timmermans
7
Hubo dos o tres ediciones de The Little Lisper antes de que The Little Schemer saliera como una traducción de esas.
cjs
9

Puedo recomendar Common Lisp en SBCL . Esta combinación es rápida, potente, madura y bien documentada.

Leslie P. Polzer
fuente
8

Además, Clojure está ganando mucha atención en estos días, y por una buena razón. Excelentes estructuras de datos, soporte de concurrencia profundamente bueno (avergüenza a Scheme y CL en este sentido) y una gran comunidad. También es relativamente simple, CL es al menos tan complicado como C ++.

Esto no quiere decir que no disfrute de CL o Scheme. Aprendí Scheme con SICP. Y CL me trajo a Clojure. Todo depende de tus objetivos, supongo. Si quieres aprender un Lisp que sea inmensamente práctico, elige Clojure. De lo contrario, CL o Scheme son excelentes.

dnolen
fuente
Esto parece implicar que ni CL ni Scheme son "inmensamente prácticos", aunque de hecho son bastante prácticos. Especialmente el estándar CL nació de consideraciones prácticas.
Leslie P. Polzer
2
El panorama del lenguaje de programación ha cambiado desde 1994, no sé cómo va a cambiar / evolucionar el estándar CL para adaptarse a lo que se ha aprendido desde ese momento. El mundo avanza dando bandazos y, por lo que puedo decir, CL está parado. Me gusta CL, Clojure tiene mucho camino por recorrer para acercarse a su potencia, pero no veo cómo va a evolucionar CL; si vas a usar lenguajes estandarizados, una ruta evolutiva debe ser evidente. Sin él, es muy probable que un idioma no sea una opción práctica.
dnolen
4
CL ha evolucionado y está evolucionando a través de muchas bibliotecas muy útiles. El idioma base ya era más poderoso en 1994 que todos los idiomas "modernos" de la actualidad.
Svante
5

Prefiero CL, ya que me gusta la programación orientada a objetos, y CLOS es el mejor sistema de objetos que existe.

jrockway
fuente
5
Hablando de CL, recomendaría ClozureCL o SBCL. Ambos son de código abierto, bien documentados, maduros, multiplataforma y proporcionan una funcionalidad no estándar crucial como el multiproceso.
Daniel Dickison
5

Aprendí Scheme en la escuela. Fue una gran experiencia de aprendizaje y nunca olvidaré los fundamentos de la programación funcional. Probablemente no importe qué versión de LISP elija, siempre que comprenda el núcleo de su utilidad: el cálculo lambda sin estado.

Aquí hay un artículo interesante sobre por qué MIT cambió de Scheme a Python en su curso de introducción a la programación.

jinsungy
fuente
3

Diría que todos, al menos al principio. Eventualmente, probablemente desarrollará una preferencia por Scheme o Common Lisp, pero ambos tienen suficientes diferencias, por lo que es mejor manejar todo lo que existe.

Scheme tiene continuaciones, por ejemplo, y es bueno aprender sobre ellas en Scheme, aunque se pueden implementar en Common Lisp.

Aprender la diferencia entre el alcance léxico y dinámico es importante, y si aprende Common Lisp y elisp, se encontrará con las implicaciones de ambos.

justinhj
fuente
0

LFE (Lisp Flavored Erlang) sería bueno. Puede tener la sintaxis lisp encima de Erlang VM.


fuente
0

Para empezar, era una especie de pregunta "cargada", pero OP probablemente no lo sabía. Generalmente, los que escuchan Common y Scheme son como las "personas" de PC y Apple, no se mezclan. Cuál es mejor probablemente no sea tan relevante como cuál "funciona" para usted. Realmente, no hay mucha diferencia. Probablemente una preferencia por uno sobre el otro puede estar influenciada por cuál aprende primero. (Para mí, una lista vacía debería ser "nada", conocido en CL como NIL, y eso me convierte en un Common Lisper.) Me gusta la integración de SBCL con Slime usando EMACS, pero SBCL no es para todos. Por un lado, SBCL es muy estricto. Si sólo quiere "divertirse", GNU clisp es fácil y está disponible para prácticamente todas las plataformas.

Wiley
fuente