Общее Lisp Программное ключевое слово Есть ли функция в Common Lisp, которая принимает строку в качестве аргумента и возвращает ключевое слово? Пример: (keyword "foo") → :foo Ответ 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, где приведены другие преобразования строк и символов, а также подробное обсуждение символов и пакетов.
Ответ 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, где приведены другие преобразования строк и символов, а также подробное обсуждение символов и пакетов.