¿Los corchetes y las llaves en Clojure siguen siendo expresiones S?

12

Estoy tratando de aprender Lisp y estoy mirando todos los Lisps que existen y sus diferencias.

Veo que en algunas implementaciones de Scheme, puede usar corchetes de manera intercambiable con corchetes para facilitar la lectura, por lo que, dado que se tratan de la misma manera, supongo que siguen siendo expresiones S como todo lo demás.

Sin embargo, en Clojure veo que los corchetes y las llaves se usan para representar diferentes tipos de datos, como vectores, etc. ¿Son estas también expresiones S válidas o deben considerarse átomos? ¿No "rompe" todo el concepto de expresiones S, haciendo que Clojure sea un Lisp "impuro"?

mydoghasworms
fuente
Técnicamente "si los corchetes son expresiones s, ¿cómo puedes expresarlos entre paréntesis?" no era parte de la pregunta, pero eso es lo que quiero saber.
Qwertie

Respuestas:

10

La notación literal para vectores y mapas (es decir, corchetes y llaves) son solo azúcar de tiempo de lectura , y cualquier cosa que pueda representar con esa notación también puede representarse con expresiones S. Como resultado, no hay pérdida de poder u homoiconicidad, y de hecho, las macros de lectura (que entiendo son aún más poderosas) están disponibles en varios ceceos.

Por cierto, tenga en cuenta que Clojure ahora proporciona un mecanismo para crear literales "etiquetados" personalizados, que, como otros literales, se transforman en expresiones S antes de que se compilen e interpreten.

tvachon
fuente
1
Mmm, tu respuesta me hace pensar que entiendo menos de lo que pensé que entendía sobre Lisp. Entonces, lo que está diciendo (creo) es que los corchetes cuadrados y rizados no son expresiones S en sí mismas. Pensé que toda la idea con la entrada de Lisp es que todo es una expresión S. Parece que necesito investigar un poco más antes de volver a leer tu respuesta nuevamente. ¡Gracias!
mydoghasworms
Eso es correcto: no son expresiones S. La sintaxis de Lisp comienza con expresiones S, ya que todo lo que se puede expresar en el lenguaje se puede expresar con expresiones S. Pero la sintaxis de Lisp no termina ahí: muchos compiladores de Lisp tienen una fase de lectura-macro explícita, en la que patrones especiales en el código fuente se transforman en expresiones S. Esto permite a los autores del lenguaje ofrecer a los programadores una sintaxis amigable para los humanos. Lo importante a tener en cuenta es que, dado que cualquier cosa representada con estos literales especiales también se puede representar en expresiones S, ninguno de los beneficios de la homoiconicidad se pierde.
tvachon
3

Las expresiones S son una representación textual de los datos. Números, símbolos, celdas, listas, cadenas, ... Common Lisp también tiene representaciones textuales para matrices, vectores, más tipos de números, caracteres, ... Common Lisp también proporciona un lector extensible por el usuario, para que el usuario pueda agregar más representaciones textuales para tipos de datos. A veces, este mecanismo también se utiliza para alterar la sintaxis del lenguaje de programación Lisp (por ejemplo, para admitir expresiones infijadas o declaraciones de otros lenguajes de programación).

Por lo tanto, si un dialecto de Lisp ofrece representaciones textuales para tipos de datos adicionales, esto encaja bien con la idea de las expresiones s.

Rainer Joswig
fuente