He intentado entender la diferencia entre Lisp-1 y Lisp-2 y cómo esto se relaciona con Clojure, pero todavía no lo entiendo correctamente. ¿Alguien puede iluminarme?
94
Según wikipedia :
Si un espacio de nombres separado para funciones es una ventaja es una fuente de controversia en la comunidad Lisp. Por lo general, se lo conoce como el debate Lisp-1 vs. Lisp-2. Lisp-1 se refiere al modelo de Scheme y Lisp-2 se refiere al modelo de Common Lisp.
Se trata básicamente de si las variables y funciones pueden tener el mismo nombre sin entrar en conflicto. Clojure es un Lisp-1, lo que significa que no permite que se use el mismo nombre para una función y una variable simultáneamente.
list
se usa a menudo como un parámetro de función y nadie cosas, Dios mío, eso es tan confuso ya que(list ...)
es una función estándar. Muchas funciones que tienenlist
como variable no usan lalist
función o no la usan cerca de esa variable. Incluso cuando eso sucede no es demasiado malo:(list foo list)
. Esto no es más confuso que una oración como "pelear la buena batalla" donde la misma palabra aparece como sustantivo y verbo.Puede que le guste leer este artículo de Richard Gabriel. Es un resumen de los problemas que la comunidad Lisp estaba discutiendo en Lisp1 vs Lisp2. Es un poco denso y lento en las primeras secciones, pero es mucho más fácil de leer cuando pasa la sección 5.
Básicamente, Lisp1 tiene un único entorno que asigna símbolos a valores, y esos valores pueden ser "regulares" o funciones. Lisp2 tiene (al menos) dos espacios de nombres (los símbolos tienen una ranura para su valor de función y otra para un valor regular). Entonces, en Lisp2, puede tener una función llamada foo y un valor llamado foo, mientras que en Lisp1, el nombre foo puede referirse solo a un solo valor (función o de otro tipo).
Hay varias compensaciones y diferencias de gusto entre los dos, pero lea el artículo para conocer los detalles. El libro de Christian Queinnec, "Lisp in Small Pieces" también tiene una discusión de las diferencias tejidas a través del texto.
fuente
funcall
yfunction
. Estos desaparecen en un Lisp-1.