¿Cuáles son las diferencias entre Clojure, Scheme / Racket y Common Lisp?

120

Sé que son dialectos de la misma familia de lenguajes llamados lisp, pero ¿cuáles son exactamente las diferencias? ¿Podría dar una descripción general, si es posible, que cubra temas como sintaxis, características, funciones y recursos?

MaiaVictor
fuente
3
Estoy pidiendo una descripción más general de las diferencias porque creo que esta pregunta puede ser útil para muchas otras personas, lo siento si suena abusivo.
MaiaVictor
4
Siempre me confunde qué publicación debería ir y dónde. Esta es una discusión de herramientas, entonces, ¿es una pregunta para aquí o para programadores? Lógicamente, diría que se lo transfieran a los programadores, porque no se trata de pedir que se resuelva un problema en particular, pero es una buena publicación con una buena respuesta en mi humilde opinión.
octopusgrabbus
1
@octopusgrabbus: la pregunta es demasiado amplia. La comparación de tres lenguajes de programación en 'sintaxis, características, funciones y recursos' puede llenar fácilmente un libro o un sitio web. Stackoverflow es para personas que tienen problemas de programación, no es una enciclopedia (Wikipedia), no es un foro de discusión general (Usenet), no es un sitio de comparación de idiomas ( rosettacode.org ). Es mejor para problemas de programación reales donde la pregunta tiene código y las respuestas también tienen código. Además: no invente problemas solo porque alguien está aburrido o es un pasatiempo.
Rainer Joswig
3
El hecho de que la pregunta sea amplia no significa que no pertenezca aquí. Es una pregunta perfectamente clara , y ciertamente es una "pregunta de programación real". StackOverflow está destinado principalmente a ser un recurso de la comunidad [googleable] para compartir conocimientos sobre programación a través del formato de preguntas y respuestas.
Dan Burton
@RainerJoswig, podría escribir todo lo que aprendí sobre esos idiomas en los últimos días que los estuve estudiando, pero eso haría que el hilo fuera grande. Eso es realmente malo cuando te das cuenta de que las personas buscarán en Google ese tipo de oración corta y no podrán obtener la respuesta porque un texto grande les impide comprender rápidamente lo que se les pregunta. Hacerlo de esta manera asegura que muchas más personas recibirán ayuda con una buena respuesta.
MaiaVictor

Respuestas:

103

Todos tienen mucho en común:

  • Lenguajes dinámicos
  • Fuertemente tipado
  • Compilado
  • Sintaxis de estilo Lisp, es decir, el código se escribe como estructuras de datos Lisp (formularios) con el patrón más común siendo llamadas a funciones como: (function-name arg1 arg2)
  • Potentes sistemas de macros que le permiten tratar el código como datos y generar código arbitrario en tiempo de ejecución (a menudo se usa para "extender el lenguaje" con nueva sintaxis o crear DSL)
  • Se utiliza a menudo en estilo de programación funcional, aunque tiene la capacidad de adaptarse a otros paradigmas
  • Énfasis en el desarrollo interactivo con un REPL (es decir, se desarrolla de forma interactiva en una instancia en ejecución del código)

Características distintivas de Common Lisp:

Características distintivas de Clojure:

  • El ecosistema de bibliotecas más grande, ya que puede usar directamente cualquier biblioteca de Java
  • Los vectores []y mapas se {}utilizan como estándar además de las listas estándar (); además de la utilidad general de los vectores y mapas, algunos creen que se trata de una innovación que hace que en general sea más legible
  • Mayor énfasis en la inmutabilidad y la programación funcional perezosa, algo inspirado por Haskell
  • Fuertes capacidades de concurrencia respaldadas por la memoria transaccional de software a nivel de idioma (vale la pena verlo: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Características distintivas del esquema:

  • Posiblemente el Lisp más simple y fácil de aprender
  • Macros higiénicas (consulte http://en.wikipedia.org/wiki/Hygienic_macro ): evita con elegancia los problemas de captura accidental de símbolos en expansiones de macro
mikera
fuente
11
esto es bueno, pero quizás debería mencionar que la raqueta es más que un simple esquema; es un sistema que admite varios idiomas (pero relacionados) (incluso puede definir el suyo). Además, clojure tiene varias formas de hacer programación tipo oo (tanto un enfoque de envío múltiple vagamente similar a clos como algo más cercano a java que es más eficiente en el jvm). y el esquema está avanzando hacia bibliotecas más estándar (que también incluyen oo) con r6rs, que racket admite.
Andrew Cooke
2
"Lenguaje dinámico fuertemente tipado" es marketing. En este sentido, incluso Python está fuertemente tipado.
ron
16
@ron: Python está fuertemente tipado, al igual que Lisp (a diferencia de Javascript o VB). En su lugar, está pensando en "escritura estática" frente a "escritura dinámica", consulte en.wikipedia.org/wiki/Type_system para todas las variedades. Pero sí, es marketing
Nas Banov
2
También creo que sería bueno agregar Racket a esta respuesta. Creo que Racket es incluso más fácil de aprender que Scheme debido a la comunidad y al enfoque del idioma. Racket (anteriormente llamado PLT Scheme) es un lenguaje de programación multi-paradigma de propósito general en la familia Lisp / Scheme. Uno de sus objetivos de diseño es servir como plataforma para la creación, el diseño y la implementación del lenguaje.
mtelesha
Clojure tiene macros higiénicas. Más información aquí: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff
50

La gente de arriba se perdió algunas cosas

  1. Common Lisp también tiene vectores y tablas hash. La diferencia es que Common Lisp usa # () para vectores y no usa sintaxis para tablas hash. El esquema tiene vectores, creo

  2. Common Lisp tiene macros de lector, que le permiten usar nuevos corchetes (al igual que Racket, un descendiente de Scheme).

  3. Scheme y Clojure tienen macros higiénicas, a diferencia de las antihigiénicas de Common Lisp

  4. Todos los idiomas son modernos o tienen proyectos de renovación extensos. Common Lisp ha obtenido bibliotecas extensas en los últimos cinco años (gracias principalmente a Quicklisp), Scheme tiene algunas implementaciones modernas (Racket, Chicken, Chez Scheme, etc.) y Clojure se creó hace relativamente poco tiempo.

  5. Common Lisp tiene un sistema OO incorporado, aunque es bastante diferente de otros sistemas OO que podría haber utilizado. En particular, no se aplica, no tiene que escribir código OO.

  6. Los lenguajes tienen filosofías de diseño algo diferentes. Scheme fue diseñado como un dialecto mínimo para entender el modelo de actor; más tarde se utilizó para la pedagogía. Common Lisp fue diseñado para unificar la miríada de dialectos Lisp que habían surgido. Clojure fue diseñado para la concurrencia. Como resultado, Scheme tiene la reputación de ser minimalista y elegante, Common Lisp de ser poderoso e independiente del paradigma (funcional, OO, lo que sea), y Clojure de favorecer la programación funcional.

Cosman246
fuente
4
Racket no es una implementación de Scheme, salvo los modos de compatibilidad. Ver stackoverflow.com/questions/3345397
error
Clojure no tiene macros higiénicas, ya que he encontrado el camino difícil.
pyon
40

No se olvide de las diferencias entre Lisp-1 y Lisp-2.

Scheme y Clojure son Lisp-1:
eso significa que tanto los nombres de variables como de funciones residen en el mismo espacio de nombres.

Common Lisp es Lisp-2: la
función y las variables tienen diferentes espacios de nombres (de hecho, CL tiene muchos espacios de nombres).

Pablo
fuente
-4

Gimp está escrito en Scheme :)

De hecho, una gran cantidad de software que algunos creen que podría estar escrito en C ++ probablemente se hizo bajo el paraguas de Lisp, es difícil distinguir las manzanas doradas del grupo. El hecho es que C ++ no siempre fue popular, solo parece serlo hoy debido a un historial de actualizaciones. Durante la mitad menor del siglo, C ++ ni siquiera utilizó subprocesos múltiples, fue donde Python es hoy un pozo negro de código de pegamento defectuoso inútil no probado. Avanzar un poco más rápido y ahora estamos viendo un aumento en la programación funcional, es más como adaptarse o morir. Creo que Java lo tiene bien en lo que respecta a la parte de adaptación.

Scheme fue diseñado para simplificar el lenguaje Lisp, esa era su única intención, excepto que nunca tuvo éxito. Creo que Clojure hace algo similar, está destinado a simplificar Scheme para la JVM nada más. Es como cualquier otro lenguaje JVM que está ahí para inflar la experiencia del usuario, solo para simplificar la escritura repetitiva en la tierra de Java.

Meeple
fuente
2
"destinado a simplificar Scheme para la JVM nada más" "como cualquier otro lenguaje JVM" Sí, claro.
oskarkv
4
Gimp está escrito en C y es compatible con Scheme, Python y Perl como lenguajes de programación.
lbalazscs