2008-10-17 38 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)))