P: ¿Cómo se crea y usa :keywords
?
Considere un intento (ingenuo, aparentemente) de acceder a la siguiente lista de juguetes:
(setf alist '((:key-1 "Key no. 1")
(:key-2 "Key no. 2")))
(assq :key-1 alist) ; => (:key-1 "Key no. 1")
(assq (make-symbol ":key-1") alist) ; => nil
La primera clave funciona como se esperaba, pero la segunda clave no. En la medida en que no exista una make-keyword
función obvia , ¿cómo se crea y usa una palabra clave?
Motivación original: necesito transformar una cadena en una clave de búsqueda que es un símbolo en el que puedo put
propiedades.
En el proceso de formulación de esta pregunta, llegué al menos a parte de la respuesta, que publico por separado. Espero que mentes más brillantes que las mías puedan mejorarlo.
(eq :foo (read ":foo"))
Respuestas:
Tiene razón al
make-symbol
crear una palabra clave que no correspondeeq
a ninguna palabra clave existente, yintern
podría contaminar la matriz global con el nuevo símbolo. Entre esos, tienesintern-soft
, que devuelve el símbolo si ya se ha creado, onil
si no:Esto debería ser adecuado para su propósito: si la palabra clave no existe, no puede estar presente en la lista, por lo que no es necesario crearla solo para verificar si está allí. Algo como:
fuente
intern-soft
pero no había pensado en usarlo de esta manera.Quizás no entiendo la pregunta correctamente. Pero si quieres una palabra clave (es decir, que quieren satisfacer
keywordp
), entonces usted quiere que el símbolo que se encuentra internado en el obarray mundial ,obarray
.Se debe ser internadas para satisfacer
keywordp
, AFAICT, yC-h f keywordp
lo dice.Entonces la respuesta a su pregunta, AFAICT, es solo para usar
intern
.Siento que tal vez no estás haciendo tu pregunta real, parece una pregunta XY. ¿Qué es lo que realmente intentas hacer? (Tal vez plantee eso como una pregunta separada).
[En respuesta a su comentario de que las prácticas " no son
:keyword
específicas, ya que se aplican a todos los símbolos ": Correcto, las prácticas no son específicas para las palabras clave. Pero el internado (enobarray
) y el uso de unsymbol-name
que comienza con:
es específico para las palabras clave.]fuente
Aquí hay una respuesta parcial a esta pregunta. La versión corta y no del todo satisfactoria parece ser: uso
intern
.:key-1
satisface ambos:Mientras
(make-symbol ":key-1")
satisface el primero pero no el segundo:Ahora, la cadena de documentación
make-symbol
dice que:Mmmkay, y la cadena de documentación para
keywordp
dice que:Entonces parece que
intern
funcionará:Porque
intern
:Pero esto no parece ser
:keyword
específico, ya que se aplica a todos los símbolos. Por defecto, también parece contaminar lo globalobarray
, lo que puede o no ser un gran problema.fuente