Вопрос

Есть ли в 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 для других преобразований строк / символов и подробного обсуждения символов и пакеты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top