如何将列表参数解释为实际列表,而不是符号?
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")
我的代码中有这样的情况:
(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")