Подтвердить что ты не робот

Общее Lisp Программное ключевое слово

Есть ли функция в Common Lisp, которая принимает строку в качестве аргумента и возвращает ключевое слово?

Пример: (keyword "foo"):foo

4b9b3361

Ответ 1

Здесь используется функция make-keyword, которая упаковывает процесс создания ключевого слова (intern имя имени в пакет KEYWORD).: -)

(defun make-keyword (name) (values (intern name "KEYWORD")))

Ответ 2

Ответы, приведенные в правильном порядке, не дают правильного решения вопроса.

Рассмотрим:

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")))

Ответ 3

В Alexandria есть функция make-keyword, хотя она сохраняет регистр так, чтобы получить именно то, что вы хотите, сначала нужно вставить строку.

Ответ 4

В этом примере он также обрабатывает строки с пробелами (заменяя их точками):

(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))

Ответ 5

В этом случае вы можете изменить строку так, чтобы она начиналась со знака двоеточия :

использовать read-from-string напрямую.

Вот еще одна версия make-keyword:

(defun make-keyword (name)
           (read-from-string (reverse (concatenate 'string 
                                                   (reverse name) ":"))))

Ответ 6

(intern "foo" "KEYWORD") -> :foo

См. Раздел " Строки" поваренной книги Common Lisp, где приведены другие преобразования строк и символов, а также подробное обсуждение символов и пакетов.