Common Lisp 中是否有将字符串作为参数并返回关键字的函数?
示例:(keyword "foo")
->:foo
给出的答案虽然大致正确,但并不能为问题的示例产生正确的解决方案。
考虑:
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
将关键字创建过程打包的函数(intern
将名称放入KEYWORD
包中)。:-)
(defun make-keyword (name) (values (intern name "KEYWORD")))
Alexandria库中有一个make-keyword
函数,尽管它确实保留了大小写,因此要准确获得您想要的内容,您必须先将字符串大写。
在此示例中,它还处理带有空格的字符串(用点替换它们):
(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))
以防万一,您可以将字符串更改为以冒号开头:
直接使用read-from-string
。
这是另一个版本make-keyword
:
(defun make-keyword (name)
(read-from-string (concatenate 'string ":" name)))
(intern "foo" "KEYWORD") -> :foo
有关其他字符串/符号转换以及符号和包的详细讨论,请参阅Common Lisp Cookbook的字符串部分。