elisp – ¿Cómo crear: palabras clave?

Pregunta:

P: ¿Cómo se crean y utilizan :keywords ?

Considere un intento (aparentemente ingenuo) 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 tecla funciona como se esperaba, pero la segunda no. En la medida en que no exista una función de creación de make-keyword obvia, ¿cómo se crea y utiliza 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 la mía puedan mejorarlo.

Respuesta:

Tiene razón en que make-symbol creará una palabra clave que no es eq a ninguna palabra clave existente, y el intern podría contaminar la matriz global con el nuevo símbolo. Entre ellos, tiene intern-soft , que devuelve el símbolo si ya se ha creado, o nil si no lo ha hecho:

ELISP> (intern-soft ":key-1")
nil
ELISP> :key-1
:key-1
ELISP> (intern-soft ":key-1")
:key-1

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:

(let ((maybe-keyword (intern-soft ":key-1")))
  (and maybe-keyword (assq maybe-keyword alist)))

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım