Common Lisp Programmatic Keyword - PullRequest
       5

Common Lisp Programmatic Keyword

26 голосов
/ 17 октября 2008

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

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

Ответы [ 6 ]

39 голосов
/ 17 февраля 2009

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

Рассмотрим:

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")))
33 голосов
/ 17 октября 2008

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

(defun make-keyword (name) (values (intern name "KEYWORD")))
2 голосов
/ 25 августа 2012

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

1 голос
/ 27 марта 2013

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

(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))
0 голосов
/ 05 апреля 2019

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

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

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

(defun make-keyword (name)
           (read-from-string (reverse (concatenate 'string 
                                                   (reverse name) ":"))))
0 голосов
/ 17 октября 2008
(intern "foo" "KEYWORD") -> :foo

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

...