2011-01-13 9 views

Respuesta

10

No hay grandes diferencias de sintaxis (sobre todo porque los lenguajes de la familia Lisp tienen casi sin sintaxis), pero ciertamente existen diferencias en otras áreas. Clojure posee una gran cantidad de características de programación modernas particularmente adecuadas para una alta escalabilidad (actores, referencias, etc.) que no están presentes como tales en un Lisp "clásico" (como Common Lisp).

Clojure es un dialecto de Lisp activo y bien soportado. Si quieres aprender un Lisp, realmente no puedes equivocarte con Clojure.

Puede encontrar más información en las respuestas a Which Lisp should I learn?.

+5

Eso está mal. Lisp tiene mucha sintaxis. Montones. Verifique como ejemplo la sintaxis de DEFCLASS, DEFSTRUCT, LOOP y otros en CL. Debajo está la sintaxis para s-expressions, que tampoco es trivial. –

+4

Pequeño punto en aras de la claridad, Rainer. Él dijo "Familia Lisp". Todos los ejemplos que ha usado son Common Lisp y yo diría que el único ejemplo válido que usted dio es LOOP, el único de esos formularios que mezcla sintaxis (palabras clave) que no sean listas. Aun así, contraste todos sus ejemplos contra Scheme, donde casi todo es DEFINE y ninguna de las estructuras que mencionó existe. – Shaun

+0

@Shaun: Scheme tiene palabras clave y macros sintácticas integradas. Ver los informes del Esquema. Comienza con LET, LAMBDA, IF, ... No confundas s-expression siendo la sintaxis de Lisp. La sintaxis de Lisp se encuentra en la parte superior de s-expresssions. Lisp en general tiene una forma simple para llamadas a funciones. Pero cada Lisp tiene algún tipo de formas sintácticas especiales Y algún tipo de macros. CADA macro ya presente en el lenguaje implementa SYNTAX. La sintaxis es la estructura de un lenguaje. Las macros definidas por el usuario son una forma en cada Lisp de tener sintaxis extensible por el usuario. La idea de "sin sintaxis" es solo un mito repetido a menudo. El opuesto es verdad. –

2

Supongo que por Lisp te refieres a Common Lisp, ya que 'Lisp' en sí mismo es más una familia de idiomas (que incluye Clojure) que un solo lenguaje específico. Hay algunos cambios sintácticos en que Clojure tenía la intención de ser un Lisp más moderno. Por ejemplo, puede crear vectores con [] s, mapas con {} s, que no son parte de Common Lisp. Y, por supuesto, la interoperabilidad de Java se convierte inevitablemente en una parte importante de Clojure.

+5

[] y {} están reservados para la extensión de usuario en CL. Los vectores se escriben como # (...). La sintaxis de los caracteres en ese nivel puede ser proporcionada por las bibliotecas, y realmente lo es. Quizás CL es el Lisp más moderno, porque la sintaxis es extensible por el usuario y los usos de [] y {} pueden ser utilizados por las bibliotecas. –

+0

Common Lisp comúnmente se llama simplemente Lisp. Del mismo modo, Lisp generalmente significa Common Lisp. La familia Lisp generalmente se denota como ceceo o ceceo. – Marko

3

creo que es justo decir que si usted aprende los principios de LISP también conocerán los principios de Clojure y viceversa. Todos están arraigados en la misma filosofía, enfatizando cosas como:

  • El código son los datos. Las macros son solo funciones normales que manipulan el código.

  • Uso de S-expressions para representar datos y códigos.

  • El concepto de una lista/secuencia como estructura fundamental.

  • Programación funcional con funciones de primera clase.

Aparte de eso, hay un montón de diferencias en la sintaxis, bibliotecas, entornos de ejecución, etc. La diferencia en mi opinión es, probablemente, casi lo mismo que C# vs. C++ - si usted sabe un pozo, a continuación, el núcleo los conceptos serán familiares, pero todavía hay muchas diferencias fundamentales.

ver este list of ways that Clojure is different from other Lisps

+0

Hay una "pequeña" diferencia entre funciones y macros. La función es de primera clase. Las macros no son – boucekv

6

90% de lo que se aprende mientras se estudia su primera Lisp se trasladará a su lado.

1

uso Clojure vectores como parámetros lambda (valores de argumentos), pero se puede escribir una macro defun y lambda con la voluntad de tener este aspecto en Common Lisp. Clojure también tiene acceso a métodos de objetos Java y fileds usando coma y el nombre que se parece a la función normal llame al

(.toString 10) - llamará método al método toString en el número 10 pero .toString no es una función. Si intentas comprobar el valor de .toString, arroja la excepción de que .toString no es un símbolo definido.

Y también en cuasi-cita (sobre todo en macros) en lugar de coma Clojure use tylda.

Cuestiones relacionadas