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-keywordfunció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 putpropiedades.
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-symbolcrear una palabra clave que no correspondeeqa ninguna palabra clave existente, yinternpodría contaminar la matriz global con el nuevo símbolo. Entre esos, tienesintern-soft, que devuelve el símbolo si ya se ha creado, onilsi 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-softpero 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 keywordplo 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
:keywordespecí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-nameque 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-1satisface ambos:Mientras
(make-symbol ":key-1")satisface el primero pero no el segundo:Ahora, la cadena de documentación
make-symboldice que:Mmmkay, y la cadena de documentación para
keywordpdice que:Entonces parece que
internfuncionará:Porque
intern:Pero esto no parece ser
:keywordespecí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