Common Lisp Programmatic Keyword
-
03-07-2019 - |
Pregunta
¿Existe una función en Common Lisp que toma una cadena como argumento y devuelve una palabra clave?
Ejemplo: (palabra clave " foo ")
- > :foo
Solución
Aquí hay una función make-keyword
que empaqueta el proceso de creación de palabras clave ( intern
ing de un nombre en el paquete KEYWORD
). :-)
(defun make-keyword (name) (values (intern name "KEYWORD")))
Otros consejos
Las respuestas dadas cuando son aproximadamente correctas no producen una solución correcta al ejemplo de la pregunta.
Considere:
CL-USER(4): (intern "foo" :keyword)
:|foo|
NIL
CL-USER(5): (eq * :foo)
NIL
Por lo general, desea aplicar STRING-UPCASE a la cadena antes de internarla, por lo tanto:
(defun make-keyword (name) (values (intern (string-upcase name) "KEYWORD")))
Hay una función make-keyword
en Alexandria la biblioteca, aunque conserva el caso, así que para obtener exactamente lo que desea, primero tendrá que subir la cadena.
En este ejemplo, también trata con cadenas con espacios (reemplazándolos por puntos):
(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))
En el caso, puede cambiar la cadena para comenzar con el signo de dos puntos :
use read-from-string
directamente.
Aquí hay otra versión de make-keyword
:
(defun make-keyword (name)
(read-from-string (reverse (concatenate 'string
(reverse name) ":"))))
(intern "foo" "KEYWORD") -> :foo
Consulte la sección Strings del Common Lisp Cookbook para otras conversiones de cadenas / símbolos y una discusión detallada de los símbolos y paquetes.