我的代码中有这样的情况:
(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
相同的事情吗?
答案 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")