2008-10-17 58 views

回答

31

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

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

差不多,但不完全。在创建关键字时,还必须确保将其值绑定到自身。 – Vatine 2014-06-06 06:14:13

+0

@Vatine我只有SBCL才能测试,而在SBCL中,`(symbol-value(intern“FOO”“KEYWORD”))`已经具有正确的值。此外,亚历山大也使用相同的方法实施它。 – 2014-06-09 14:37:49

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

其他串/符号转换和符号和包的详细讨论见Common Lisp CookbookStrings section

+3

的名称需要在“关键字”包被扣留是一个关键字。例如(intern“FOO”“KEYWORD”) – 2008-10-17 11:24:28

+0

啊是的。 (intern“foo”“KEYWORD”)工作得非常好。谢谢。 – nathan 2008-10-17 11:30:30

+0

在我的回答中,我将它打包成一个整洁的小功能,您可以享受。 :-) – 2008-10-17 11:33:39

35

在大致正确的情况下给出的答案并不能为问题的例子提供正确的解决方案。

考虑:

CL-USER(4): (intern "foo" :keyword) 

:|foo| 
NIL 
CL-USER(5): (eq * :foo) 

NIL 

通常你想实习之前将字符串UPCASE适用于字符串,即:

(defun make-keyword (name) (values (intern (string-upcase name) "KEYWORD"))) 
2

有一个在Alexandriamake-keyword功能,虽然它保存大小写以得到你想要的东西,然后你必须首先处理字符串。

1

在本例中它也与空格的字符串(由点代替)涉及:

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