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?
Respuestas:
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:
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.
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.
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.
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 .
fuente
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.
fuente
Puedo recomendar Common Lisp en SBCL . Esta combinación es rápida, potente, madura y bien documentada.
fuente
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.
fuente
Prefiero CL, ya que me gusta la programación orientada a objetos, y CLOS es el mejor sistema de objetos que existe.
fuente
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.
fuente
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.
fuente
LFE (Lisp Flavored Erlang) sería bueno. Puede tener la sintaxis lisp encima de Erlang VM.
fuente
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.
fuente