¿Cuáles son las diferencias entre Clojure, Scheme/Racket y Common Lisp?
common-lisp (4)
Gimp está escrito en Scheme :)
De hecho, la asignación de software que algunas personas creen que podría escribirse en C ++ probablemente se hizo bajo el paraguas Lisp, es difícil distinguir las manzanas doradas del grupo. El hecho es que C ++ no siempre fue popular, solo parece ser popular hoy en día debido a un historial de actualizaciones. Durante la mitad menor del siglo, C ++ ni siquiera utilizó el multihilo, fue donde Python es hoy un sumidero de código inútil de pegamento con errores. Más rápido un poco y ahora estamos viendo un aumento en la programación funcional, es más como adaptarse o morir. Creo que Java tiene razón 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 se entendió realmente. Creo que Clojure hace algo similar, su intención es simplificar Scheme para la JVM nada más. Es exactamente como cualquier otro lenguaje JVM para inflar la experiencia del usuario, solo para simplificar el texto estándar en Java.
Sé que son dialectos de la misma familia de lenguaje llamada lisp, pero ¿cuáles son exactamente las diferencias? Podría proporcionar una descripción general, si es posible, que cubra temas como la sintaxis, las características, las características y los recursos.
La gente de arriba se perdió algunas cosas
Common Lisp tiene vectores y tablas hash también. La diferencia es que Common Lisp usa # () para vectores y sin sintaxis para tablas hash. Scheme tiene vectores, creo
Common Lisp tiene macros de lector, que le permiten usar nuevos corchetes (como Racket, un descendiente de Scheme).
Scheme y Clojure tienen macros higiénicas, a diferencia de las antihigiénicas de Common Lisp
Todos los idiomas son modernos o tienen grandes proyectos de renovación. 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.
Common Lisp tiene incorporado un sistema OO, aunque es bastante diferente de otros sistemas OO que podría haber usado. En particular, no se aplica, no es necesario escribir código OO.
Los idiomas tienen filosofías de diseño algo diferentes. El esquema se diseñó como un dialecto mínimo para comprender el Modelo 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 concurrencia. Como resultado, Scheme tiene una reputación de ser mínimo y elegante, Common Lisp de ser poderoso y paradigmático-agnóstico (funcional, OO, lo que sea), y Clojure de favorecer la programación funcional.
No te olvides de las diferencias Lisp-1 y Lisp-2.
Scheme y Clojure son Lisp-1:
Eso significa que tanto las variables como los nombres de las 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).
Todos tienen mucho en común:
- Lenguajes dinámicos
- Fuertemente tipado
- Compilado
- Sintaxis 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 macro que le permiten tratar el código como datos y generar código arbitrario en tiempo de ejecución (a menudo utilizado para "extender el idioma" con nueva sintaxis o crear DSL)
- A menudo se utiliza en el estilo de programación funcional, aunque tiene la capacidad de adaptarse a otros paradigmas
- Énfasis en el desarrollo interactivo con un REPL (es decir, desarrollas interactivamente en una instancia en ejecución del código)
Rasgos distintivos de Lisp común:
- Un poderoso subsistema OOP ( Common Lisp Object System )
- Probablemente el mejor compilador (Common Lisp es el Lisp más rápido según http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html aunque no hay mucho en él ...)
Características distintivas de Clojure:
- El ecosistema de biblioteca más grande, ya que puede usar directamente cualquier biblioteca de Java
- Vectores
[]
y mapas{}
utilizados como estándar además de las listas estándar()
: además de la utilidad general de vectores y mapas, algunos creen que esta es una innovación que hace que, en general, sea más legible. - Mayor énfasis en la inmutabilidad y la programación funcional perezosa, algo inspirada por Haskell
- Fuertes capacidades de simultaneidad compatibles con la memoria transaccional de software en el nivel de idioma (vale la pena mirar: 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
- Las macros higiénicas (ver http://en.wikipedia.org/wiki/Hygienic_macro ) - elegantemente evita los problemas con la captura accidental de símbolos en expansiones macro