假设我有一个功能
CL-USER> (defun trimmer (seq) "This trims seq and returns a list"
(cdr
(butlast seq)))
TRIMMER
CL-USER> (trimmer '(1 2 3 VAR1 VAR2))
(2 3 VAR1)
CL-USER>
请注意,由于QUOTE,VAR1和VAR2未解决。假设我想将符号VAR1和VAR2解析为它们的值 - 是否有标准函数来执行此操作?
答案 0 :(得分:6)
不要使用quote
创建包含变量的列表;改为使用list
:
CL-USER> (trimmer (list 1 2 3 var1 var2))
(2 3 value-of-var1)
(其中value-of-var1
是var1
)的值。
Quote
仅阻止评估其参数。如果它的参数恰好是列表文字,则返回。但是,要创建不仅仅是文字的列表,请使用list
。你可以使用反引用语法,但在这种情况下这是混淆。
答案 1 :(得分:4)
Backquote是将值插入引用列表的常用方法:
> (setq var1 4 var2 5)
5
> `(1 2 3 ,var1 ,var2)
(1 2 3 4 5)
编辑添加:如果你想处理一个列表以便用他们的symbol-value
替换符号,那么你需要一个像这样的函数:
(defun interpolate-symbol-values (list)
"Return a copy of LIST with symbols replaced by their symbol-value."
(loop for x in list
collect (if (symbolp x) (symbol-value x) x)))
> (interpolate-variables '(1 2 3 var1 var2))
(1 2 3 4 5)
然而,这似乎是一件奇怪的事情。你能说一下你想要达到的目标吗?几乎可以肯定,有一种比这更好的方法。