¿Cuál es la diferencia entre Lisp-1 y Lisp-2?

94

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?

appshare.co
fuente

Respuestas:

68

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.

Pauldoo
fuente
11
¿No es un Lisp-2 más confuso tener funciones y variables con los mismos nombres entonces?
appshare.co
39
Parte de la razón es que los programadores que usan dialectos Lisp-2 no se desviven por tener funciones y variables con los mismos nombres. listse 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 tienen listcomo variable no usan la listfunció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.
Kaz
5
@Zubair Java tiene aún más espacios de nombres. Puede definir una clase, un método y una variable con el mismo nombre.
hasta
19
Como mnemónico, creo que Lisp 1 tiene 1 espacio de nombres y Lisp 2 tiene 2 espacios de nombre (uno para funciones y otro para variables).
Nick McCurdy
4
@NickMcCurdy Como nemotécnico, pienso que una bicicleta tiene dos ruedas y un triciclo que tiene tres.
Kaz
71

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.

Peter McLain
fuente
7
Una de las secciones más enigmáticas del artículo de Gabriel es la sección 11 sobre multiprocesamiento. En esa sección, él implica que Lisp1 es más propicio para un estilo funcional de programación, por lo tanto más propicio para el multiprocesamiento. Obviamente, esto es de interés para Clojure. Pero no estoy muy seguro de por qué Lisp1 es más propicio para FP. ¿Alguien tiene una idea de esto?
Peter McLain
40
probablemente porque el punto principal de FP es tratar las funciones como valores de primera clase, por lo tanto, es mucho más conveniente y conceptualmente más limpio tratarlas de la misma manera que todos los demás valores
mikera
10
@PeterMcLain Cuando los usuarios de dialectos Lisp-1 dicen que Lisp-1 es más propicio para la programación funcional, lo que quieren decir es que no tienes que rellenar el código con operadores funcally function. Estos desaparecen en un Lisp-1.
Kaz
3
Un ejemplo de lo que sucede cuando un Schemer intenta escribir Lisp: emacs.stackexchange.com/q/28979/2787
2016
2
usaste la frase "al menos" sobre Lisp-2. La diferenciación simple entre los 2 casos es: si el símbolo está en la posición inicial de una expresión-s, o no (si es así, busque en el espacio de nombres de la función, de lo contrario en el espacio de nombres de variables). ¿Puede dar algunos ejemplos de otros casos además de esos 2?
Daniel Dinnyes