27

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

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

4

6 回答 6

41

给出的答案虽然大致正确,但并不能为问题的示例产生正确的解决方案。

考虑:

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")))
于 2009-02-17T08:52:24.810 回答
33

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

(defun make-keyword (name) (values (intern name "KEYWORD")))
于 2008-10-17T11:31:29.067 回答
3

Alexandria库中有一个make-keyword函数,尽管它确实保留了大小写,因此要准确获得您想要的内容,您必须先将字符串大写。

于 2012-08-25T01:03:37.870 回答
1

在此示例中,它还处理带有空格的字符串(用点替换它们):

(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))
于 2013-03-27T11:47:26.100 回答
1

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

直接使用read-from-string

这是另一个版本make-keyword

(defun make-keyword (name)
           (read-from-string (concatenate 'string ":" name)))
于 2019-04-05T00:45:39.573 回答
-5
(intern "foo" "KEYWORD") -> :foo

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

于 2008-10-17T11:22:37.337 回答