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

How to interpret a list parameter as an actual list, not a symbol?

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

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

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

现在 (process names) 工作正常,但 (process (second pair)) returns 出现错误(无法获取 NAMES 的 CAR)。当我调试时,我注意到对于后一个调用,参数被 type-of 视为符号,而不是值列表(listp returns nil)。我该如何克服这个问题或者我做错了什么? (second pair)names 不一样吗?

检查 (second pair) 是否与 REPL 中的 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")