Common Lisp程序化关键字

时间:2008-10-17 10:54:37

标签: common-lisp

Common Lisp中是否有一个函数将字符串作为参数并返回一个关键字?

示例:(keyword "foo") - > :foo

6 个答案:

答案 0 :(得分:39)

大致正确的答案并没有为问题的例子提供正确的解决方案。

考虑:

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

答案 1 :(得分:33)

这是一个make-keyword函数,它将关键字创建过程(intern名称打包到KEYWORD包中)。 : - )

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

答案 2 :(得分:2)

Alexandria库中有一个make-keyword函数,虽然它确实保留了大小写,但为了得到你想要的东西,你必须首先将字符串加起来。

答案 3 :(得分:1)

在这个例子中,它还处理带空格的字符串(用点替换它们):

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

答案 4 :(得分:0)

以防万一,您可以将字符串更改为以冒号:开头

直接使用read-from-string

这是make-keyword的另一个版本:

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

答案 5 :(得分:-4)

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

有关其他字符串/符号转换以及符号和包的详细讨论,请参阅Strings sectionCommon Lisp Cookbook