Pregunta

¿Existe una función en Common Lisp que toma una cadena como argumento y devuelve una palabra clave?

Ejemplo: (palabra clave " foo ") - > :foo

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top