2009-06-17 13 views
73

Sé que hay algunos dialectos diferentes de Lisp. Después de haber decidido que aprender Lisp sería una nueva experiencia intelectual, me gustaría saber qué dialecto de Lisp aprender y por qué.¿Qué dialecto de Lisp debo aprender?

¿Hay una que es más popular que los otros? ¿Alguno de ellos es más "completo", como en, mejor documentado y respaldado? ¿Cuáles son los pros y los contras de este dialecto?

+1

Duplicado: http://stackoverflow.com/questions/563356/which-lisp-should-i-learn –

+0

Hice una búsqueda sobre eso antes de preguntar esto pero la naturaleza de la pregunta evolucionó cuando estaba tipeando. Me aseguraré de no reinventar la rueda. –

+0

Entonces, ¿cuál es la diferencia entre esta pregunta y la que Greg menciona arriba? –

Respuesta

21

Diría Scheme, únicamente por el Little Schemer, que es uno de los libros más alucinantes pero extremadamente difíciles que he intentado leer.

+13

¡No te olvides de SICP! http://mitpress.mit.edu/sicp/. Esta es una lectura clásica. –

+6

Hubo dos o tres ediciones de _The Little Lisper_ antes de _The Little Schemer_ salió como una traducción de aquellos. –

5

prefiero CL, ya que me gusta la programación orientada a objetos, y CLOS es el sistema objeto más bonito alrededor.

+5

Hablando de CL, recomendaría ClozureCL o SBCL. Ambos son de código abierto, bien documentados, maduros, multiplataforma, y ​​proporcionan una funcionalidad crucial no estándar, como el multihilo. –

4

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

Aquí hay un artículo interesante en Why MIT switched from Scheme to Python en su curso de programación introductoria.

8

también Clojure es un ganar un montón de reconocimiento de marca en estos días, y por buenas razones. Grandes estructuras de datos, soporte de concurrencia profundamente bueno (pone a Scheme y CL a la vergüenza en este sentido), y una gran comunidad. También es relativamente simple, CL es tan complicado como C++.

Esto no quiere decir que no me gusta CL o Esquema. 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, ve a Clojure. De lo contrario, CL o Scheme son geniales.

+0

Esto parece implicar que ni CL ni Scheme son "inmensamente prácticos", mientras que de hecho son bastante prácticos. Especialmente el estándar CL * nació * por consideraciones prácticas. – skypher

+2

El panorama del lenguaje de programación ha cambiado desde 1994, no sé cómo el estándar CL va a cambiar/evolucionar para acomodar lo que se ha aprendido desde ese momento. El mundo se tambalea hacia adelante y, por lo que puedo ver, CL está quieto. Me gusta CL, Clojure tiene mucho camino por recorrer para acercarse a su poder, pero no veo cómo evolucionará CL: si vas a utilizar un lenguaje estandarizado, un camino evolutivo debe ser evidente. Sin él, es muy probable que un lenguaje no sea una elección práctica. – dnolen

+3

CL ha evolucionado y está evolucionando a través de muchas bibliotecas muy útiles. El lenguaje base ya era más poderoso en 1994 que todos los idiomas "modernos" de la actualidad. – Svante

9

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

2

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

El esquema tiene continuaciones, por ejemplo, y es bueno aprender sobre las de Scheme, aunque se pueden implementar en Common Lisp.

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

62

Desea buscar un equilibrio entre simplicidad y limpieza, características atractivas y una plataforma que le permita escribir un software útil e interesante (para usted) y que sirva como herramienta de aprendizaje. (Esta última te permitirá seguir adelante y aprender por mucho más tiempo.) He aquí algunas posibilidades:

  1. Esquema. Probablemente el más limpio de todos los dialectos. Esta es sin duda la razón por la cual The Little Schemer se tradujo de LISP a Scheme. La quinta especificación estándar de Scheme, R5R2, es una maravillosa educación en sí misma; puede ser la mejor especificación de lenguaje y biblioteca que he leído, así como la más corta que sea razonablemente completa. La plataforma PLT Scheme incluye un intérprete y un compilador bastante decentes, es bueno para los scripts, y también tiene algunas herramientas visuales que lo hacen excelente para el aprendizaje.

  2. Common Lisp. Probablemente la variante más portátil y completa, esto es lo más probable si desea escribir cosas como software comercial. El estándar define bibliotecas extensas, y muchas más están disponibles más allá de eso, tiene CLOS, que probablemente le enseñará más sobre OO que cualquier lenguaje de 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 hacen referencia a funciones), no ser tan limpias y simples (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), sin tener macros higiénicas, y haciendo hincapié en la recursión mucho menos que Scheme.

  3. Clojure. Esto se ejecuta en la JVM, lo que puede darle una ventaja allí para los desarrolladores de Java. Tiene algunas verrugas (por ejemplo, debe solicitar explícitamente la optimización de la cola de llamadas, aunque esto puede cambiar un día si se agrega TCO a la JVM). Las macros, si bien no son higiénicas, sí tienen algunas características que lo ayudarán a evitar la captura variable, por lo que puede capturar variables si realmente lo desea, mientras corre menos riesgo de hacerlo accidentalmente que en CL. Tienes fácil acceso a todas las bibliotecas de Java; eso es probablemente una buena cosa 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 acerca de los nuevos métodos para lidiar con la programación simultánea y paralela. Parece que Clojure es tan útil para grandes aplicaciones de producción 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 hacer. 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 fallas más grandes es el alcance dinámico, pero hay muchas otras. Sin embargo, si usted es un usuario de Emacs, esta puede ser la herramienta más poderosa que puede aprender para mejorar su uso del editor. Lo mucho que aprenderías realmente aprendiendo Emacs Lisp, más allá de cómo extender Emacs, para mí es una pregunta abierta; No sé con qué frecuencia técnicas realmente interesantes, como las funciones de orden superior, se usan realmente en Emacs Lisp.

+3

Tener espacios de nombres separados no es una verruga, solo es 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. Además de la comodidad que puedo llamar una lista de "listas" y un "automóvil" de automóvil en CL, su macro sistema es mucho más práctico y útil, porque el compilador no confunde las cosas tan fácilmente. – Svante

+0

Clojure no tiene optimización de cola de llamada, y no puede, porque el bytecode de JVM no lo admite. Todo lo que tiene es una forma especial "recurrente" que autorreproduce la función actual. – Svante

+0

Svante: gracias por su comentario de TCO; Agregué una nota a la publicación que indica que la necesidad de utilizar 'recurrencia' puede desaparecer si la JVM agrega soporte TCO. –

0

LFE (Lisp Flavored Erlang) sería agradable. Puede tener la sintaxis lisp en la parte superior de la VM Erlang.

0

Para empezar, era una especie de pregunta "cargada" pero OP probablemente no lo sabía. Por lo general, los usuarios comunes y de Scheme son como "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 tal vez influida por cuál aprendes primero. (Para mí, una lista vacía debe ser "nada", conocida en CL como NIL, y eso me convierte en 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 solo quiere "divertirse", el clisp de GNU es fácil y está disponible para prácticamente cualquier plataforma.

Cuestiones relacionadas