Программное ключевое слово Common Lisp
-
03-07-2019 - |
Вопрос
Есть ли в Common Lisp функция, которая принимает строку в качестве аргумента и возвращает ключевое слово?
Пример: (keyword "foo")
-> :foo
Решение
Вот функция make-keyword
, которая упаковывает процесс создания ключевого слова ( intern
имени в пакет KEYWORD
). : -)
(defun make-keyword (name) (values (intern name "KEYWORD")))
Другие советы
Приведенные ответы, хотя и являются приблизительно правильными, не дают правильного решения к примеру вопроса.
Рассмотреть:
CL-USER(4): (intern "foo" :keyword)
:|foo|
NIL
CL-USER(5): (eq * :foo)
NIL
Обычно вы хотите применить STRING-UPCASE к строке перед ее интернированием, таким образом:
(defun make-keyword (name) (values (intern (string-upcase name) "KEYWORD")))
В Александрии есть функция make-keyword
библиотека, хотя она и сохраняет регистр, поэтому для получения именно того, что вам нужно, сначала нужно указать строку в верхнем регистре.
В этом примере он также работает со строками с пробелами (заменяя их точками):
(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))
В этом случае вы можете изменить строку, чтобы она начиналась со знака двоеточия :
используйте чтение из строки
напрямую.
Вот еще одна версия make-keyword
:
(defun make-keyword (name)
(read-from-string (reverse (concatenate 'string
(reverse name) ":"))))
(intern "foo" "KEYWORD") -> :foo
См. раздел «Строки» Common Lisp Cookbook для других преобразований строк / символов и подробного обсуждения символов и пакеты.