Si mi intención es descubrir un LISP, ¿cuál es el más adecuado entre Scheme y Common Lisp?

La mayoría de los lenguajes de programación tienen verrugas; errores, inconsistencias en el diseño, compromisos hechos para satisfacer una necesidad comercial u otra. Algunos idiomas son principalmente verrugas.

Scheme tiene la menor cantidad de verrugas, la mejor relación señal / ruido de todos los idiomas que conozco. Está a cierta distancia de ser el lenguaje más práctico, pero su poder es fenomenal. El diseño mínimo no fue deliberado, pero los inventores de Scheme lograron eliminar las características cosméticas de Lisp sin reducir en absoluto el alcance del lenguaje. Casi no hay complejidad incidental en Scheme (excepto las que agrega). Construyes abstracciones y razonas sobre ellas. Nada se interpone en el camino.

Scheme tiene las especificaciones de idioma más pequeñas, toma muy poco tiempo aprender y nada de lo que aprenda se desperdiciará. Si continúa aprendiendo Common Lisp, todo lo que ha aprendido hasta ahora será útil, incluso las diferencias ( por qué Lisp 1 o Lisp 2, por qué las macros higiénicas son menos importantes para Lisp 2, etc.). Si nunca aprende otro Lisp, aún no se desperdiciará.

Si cree que un lenguaje con la función incorporada X (ya sea X es concurrencia o la capacidad de crear aplicaciones GUI o lo que sea) es más poderoso que uno sin, no se moleste con Scheme. Si valoras la abstracción (o quieres aprender a valorar la abstracción), Scheme.

Esquema. Es conceptualmente más coherente y (¿así?) Más fácil de entender. CommonLisp es más potente en su biblioteca estándar y entornos listos para producción. Pero, si quieres estar listo para la producción y ser “real”, también podrías ir a Clojure. Después de entender Scheme, eso es.

Los beneficios obvios de Scheme son dobles:

  1. Se presenta en SICP …
  2. Es un Lisp-1, es decir, un Lisp donde las funciones son verdaderamente ciudadanos de primera clase, mientras que en CommonLisp, al ser un Lisp-2, se degradan a un mundo de enlace paralelo separado, accesible a través de algún truco sintáctico adicional.
  3. En mi opinión extremadamente humilde, CommonLisp es realmente una desviación del espíritu del verdadero pensamiento funcional, especialmente con todas las diversas formas de conjuntos que se usan con demasiada frecuencia en ese mundo, tal vez en un intento de hacerlo “programación real” mientras que otros Lisps (como Clojure) han demostrado que uno puede abordar la programación desde un POV más inmutable y similar a Haskell.

EDITAR: separé el segundo elemento en dos y dejé en claro que estaba hablando de CommonLisp en el último. ¡Lo siento por eso!

Honestamente, esto depende de sus preferencias personales, pero estoy dispuesto a apostar que para la gran mayoría de las personas, si tiene que elegir solo una, Common Lisp será una experiencia de aprendizaje mucho más gratificante que Scheme, y es precisamente por las razones que la gente te dice que ignores y aprendas Scheme.

En pocas palabras, Scheme es hipoalergénico. Es limpio, pulido, construido más como una teoría matemática que como un lenguaje de programación. Y esa es exactamente la razón por la que no debes enfocarte únicamente en eso. El esquema es como una exhibición de museo. Puede estudiarlo durante años y aún encontrar nuevos aspectos interesantes de su diseño, o algunas conexiones abstractas entre diferentes campos y programación y matemáticas que nunca pensó que existirían.

En el extremo opuesto del espectro, Common Lisp es una monstruosidad pesada de funciones de biblioteca, efectos con estado desenfrenados, una división arbitraria entre tipos definidos por el usuario y tipos proporcionados por el sistema, y ​​macros sin absolutamente ninguna rueda de entrenamiento. Sin embargo, la fealdad es exactamente la razón por la que debes aprender Common Lisp. El mundo real es un lugar caótico, bellamente feo. Si su idioma es prístino, entonces toda la fealdad del mundo tendrá que colocarse en su psique o en su código. Compartir la fealdad con tu lenguaje de programación te da espacio para respirar.

Si lo que acabo de escribir no tiene sentido para usted, es porque es algo hiberbólico y usa una analogía tensa generosamente. Pero hay un núcleo de verdad en ello, y Python es el brillante ejemplo de esta verdad. Python es un lenguaje decididamente pragmático, y la gran cantidad de bibliotecas disponibles para calcular prácticamente cualquier tarea son evidencia suficiente de su pragmatismo. Perl es posiblemente el lenguaje más pragmático que se me ocurre, pero quizás absorbe demasiado caos de la realidad.

Common Lisp tiene suficiente Lisp para enseñarle algo, y suficiente pragmatismo para permitirle aprender.

Scheme está diseñado para el estudio académico, y hay docenas, si no cientos, de cursos introductorios disponibles para aprenderlo, muchos de ellos ahora disponibles gratuitamente en línea.

CL está más “comercializado” para programadores experimentados, y aunque hay un cierto cuerpo de libros introductorios, muchos de ellos asumen alguna experiencia previa en programación. El lenguaje en sí también incorpora mucha más flexibilidad, lo que puede permitir a los principiantes “perderse” tal vez más fácilmente. Sin embargo, permite que alguien aplique más fácilmente su conocimiento existente más fácilmente, incluso si el código resultante no es lo que un Lisper consideraría como “coloquial”; por ejemplo, iterar sobre elementos de una matriz por índice en lugar de usar una función de mapeo. Sin embargo, a medida que otros lenguajes adoptan más de las capacidades de CL (por ejemplo, Java, JavaScript), la barrera para la comprensión disminuye cada año.

Suponiendo que “descubriendo” quiere decir que le gustaría aprender a programar en Lisp: Scheme es el más simple y el que le enseñaría la teoría de programación más rápida.

CL es más para uso práctico, destinado a ejecutar programas rápidos en lugar de tratar de hacer todo de la manera “correcta”.

Pero como Nikolay Matyushev ya mencionó … obtienes otros Lisps además de estos dos. Así como obtienes muchos otros idiomas en la rama C de idiomas (o más bien en la rama Algol / Fortran). Para poner esto en una especie de perspectiva, haciendo coincidir algunos de los diversos Lisps con sus “Fortrans” simétricos: Esquema <-> C; CL <-> C ++; Clojure <-> Java; NewLisp <-> JavaScript; Dylan <-> Python. Y al igual que puede obtener varios otros idiomas intercambiables en la sucursal de Fortran, muchos Lisps pueden hacer lo mismo que otros.

Nota: NO digo que sean equivalentes, solo para tratar de explicar la diferencia entre los diversos Lisps en términos de diferencias similares entre los diversos lenguajes tipo C.

Si su intención es puramente pedagógica, por ejemplo, para aprender lo que es hermoso de Lisp, en lugar de escribir realmente un software de producción, iría con Scheme.

Scheme es un lenguaje pequeño que captura la esencia de lo que buscas.

Si tiene algún fondo de Java, es mejor que comience con Clojure + ClojureScript.

Scheme y Common Lisp son de 2 ramas distintas de familias de idiomas LISP.

Recomiendo aprender tanto a partir de Scheme como tenemos este gran libro: Estructura e interpretación de programas de computadora

He intentado tanto esquema como Common Lisp. Comience con Common Lisp. Practical Common Lisp es una excelente lectura. La mayoría de los libros se centran más en las desventajas de los cdr de automóviles. Este libro solo tiene pocas páginas sobre listas.

Para el esquema, “El lenguaje de programación del esquema” es el libro para leer.

Lisp común es latte mientras que el esquema es espresso. Si tuviera que usar Lisp hoy, usaría clojure. He intentado 4 intentos de entender a Lisp, finalmente lo obtuve. Las macros están completamente fuera del mundo una vez que las obtienes. Use sbcl o clisp con emacs slime.