如何将列表参数解释为实际列表,而不是符号?

时间:2016-02-28 18:05:28

标签: lisp common-lisp evaluation

我的代码中有这样的情况:

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

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

现在(process names)工作正常,但(process (second pair))返回错误(无法获取NAMES的CAR)。当我调试时,我注意到对于后者调用,参数被type-of视为符号,而不是值列表(listp返回nil)。我怎样才能克服这个或者我做错了什么?不是(second pair)names相同的事情吗?

1 个答案:

答案 0 :(得分: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")