2016-02-28 59 views
0

我在我的代碼,這樣的情況:如何將列表參數解釋爲實際列表,而不是符號?

(defparameter names (list "Alice" "John" "Jack")) 
(defparameter pair '(:smt names)) 

(defun process (a-list) (first a-list)) 

現在(process names)工作正常,但(process (second pair))返回一個錯誤(不能帶名字的CAR)。當我調試時,我注意到對於後面的調用,參數被認爲是type-of的符號,而不是值列表(listp返回nil)。我如何克服這個問題或者我做錯了什麼?是不是(second pair)names一樣?

回答

1

檢查REPL中(second pair)是否與names相同很容易。

CL-USER> (second pair) 
NAMES 
CL-USER> names 
("Alice" "John" "Jack") 
CL-USER> 'names 
NAMES 
CL-USER> (second (list ':smt names)) 
("Alice" "John" "Jack") 
CL-USER> (second (list ':smt 'names)) 
NAMES 

您可以看到它與'names相同; pair是兩個符號的列表。

要使用quasiquote和評估names,而不是引用它,它是可能的:

CL-USER> (second `(:smt ,names)) 
("Alice" "John" "Jack") 
+0

感謝。這當然是有效的。我不認爲外部報價會影響符號「名稱」到其實際值的轉換。我仍然試圖習慣LISP。 – pembeci

相關問題