Tengo un conocimiento pasajero de otros Lisps (particularmente Scheme) desde hace mucho tiempo. Recientemente he estado leyendo sobre Clojure . Veo que tiene "símbolos" y "palabras clave". Símbolos con los que estoy familiarizado, pero no con palabras clave.
¿Otros Lisps tienen palabras clave? ¿En qué se diferencian las palabras clave de los símbolos además de tener notación diferente (es decir, dos puntos)?
Respuestas:
Aquí está la documentación de Clojure para palabras clave y símbolos.
Las palabras clave se utilizan generalmente como "cadenas constantes" ligeras, por ejemplo, para las claves de un mapa hash o los valores de envío de un método múltiple. Los símbolos generalmente se usan para nombrar variables y funciones y es menos común manipularlos como objetos directamente, excepto en macros y demás. Pero no hay nada que le impida usar un símbolo en todas partes donde use una palabra clave (si no le importa citarlos todo el tiempo).
La forma más fácil de ver la diferencia es leer
Keyword.java
ySymbol.java
en la fuente Clojure. Hay algunas diferencias obvias de implementación. Por ejemplo, un símbolo en Clojure puede tener metadatos y una palabra clave no.Además de la sintaxis de dos puntos, puede usar dos puntos para crear una palabra clave calificada para el espacio de nombres.
Common Lisp tiene palabras clave, al igual que Ruby y otros idiomas. Son un poco diferentes en esos idiomas, por supuesto. Algunas diferencias entre las palabras clave Common Lisp y las palabras clave Clojure:
Las palabras clave en Clojure no son símbolos.
Las palabras clave no pertenecen a ningún espacio de nombres a menos que las califique específicamente:
(Gracias a Rainer Joswig por darme ideas de cosas para mirar).
fuente
(eval (eval ':a))
vs(eval (eval ''a))
. ¿Hay otras ventajas? En cuanto al rendimiento, ¿son idénticos?Lisp común tiene símbolos de palabras clave.
Las palabras clave también son símbolos.
Lo que hace que las palabras clave sean especiales:
De lo contrario, las palabras clave son símbolos ordinarios. Por lo tanto, las palabras clave pueden nombrar funciones o tener listas de propiedades.
Recuerde: en Common Lisp, los símbolos pertenecen a un paquete. Esto se puede escribir como:
Para los símbolos de palabras clave eso significa que: foo, keyword: foo y keyword :: foo son todos el mismo símbolo. Por lo tanto, las dos últimas notaciones generalmente no se usan.
Entonces: foo solo se analiza para estar en el paquete KEYWORD, suponiendo que no dar nombre al paquete antes del nombre del símbolo significa por defecto el paquete KEYWORD.
fuente
Las palabras clave son símbolos que se evalúan a sí mismas, por lo que no tiene que acordarse de citarlas.
fuente
: las palabras clave también son tratadas especialmente por muchas de las colecciones, lo que permite una sintaxis realmente conveniente.
es lo mismo que
esto hace que las cosas sean un poco más flexibles
fuente
Para las palabras clave, los valores hash se calculan y almacenan en caché cuando la palabra clave se construye por primera vez. Al buscar una palabra clave como una clave hash, simplemente devuelve el valor hash precalculado. Para cadenas y símbolos, el hash se recalcula en cada búsqueda.
Por qué las palabras clave con el mismo nombre son siempre idénticas, contienen sus propios valores hash. Como la búsqueda en mapas y conjuntos se realiza a partir de teclas hash, esto implica una mejor eficiencia de búsqueda en el caso de numerosas búsquedas, no en la búsqueda misma.
fuente
Las palabras clave son globales , los símbolos no lo son .
Este ejemplo está escrito en JavaScript, pero espero que ayude a transmitir el punto.
Cuando construyes un símbolo usando la
Symbol
función, obtienes un símbolo distinto / privado cada vez. Cuando solicite un símbolo a través de laSymbol.for
función, obtendrá el mismo símbolo cada vez.Estos son todos iguales.
Los nombres de argumentos de funciones son locales. es decir, no palabras clave.
fuente