解析公共Lisp列表中的符号

解析公共Lisp列表中的符号,lisp,common-lisp,symbols,evaluation,Lisp,Common Lisp,Symbols,Evaluation,假设我有一个函数 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解析为它们的值-是否有标准函数来执行此

假设我有一个函数

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解析为它们的值-是否有标准函数来执行此操作?

是将值插入到引用列表中的常用方法:

> (setq var1 4 var2 5)
5
> `(1 2 3 ,var1 ,var2)
(1 2 3 4 5)
编辑以添加:如果要处理列表以便用符号替换符号,则需要类似以下内容的函数:

(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)

然而,这似乎是一件奇怪的事情。你能说更多关于你想要达到的目标吗?几乎可以肯定有比这更好的方法。

不要使用
quote
创建包含变量的列表;使用
列表

CL-USER> (trimmer (list 1 2 3 var1 var2))
(2 3 value-of-var1)
(其中
value-of-var1
var1
的值)


Quote
仅阻止对其参数进行求值。如果它的参数恰好是一个列表文字,则返回它。但是,要创建不仅仅是文字的列表,请使用
list
。您可以使用反引号语法,但在这种情况下这是相当模糊的。

使用
list
而不是
quote
,有什么问题?在Lisp上下文中,“resolve”是什么意思?Lisp中计算值的基本操作称为求值。我不知道列表中可能有多少未解析的变量。为什么?在您的问题描述中,您提到使用
QUOTE
。如果你可以使用
QUOTE
你当然可以使用backquote?(也许你需要更明确地描述一下你的问题。)@Gareth:我使用引号是为了确保第一个参数不是作为函数计算的。是的,但是backquote也避免了函数应用。我还不明白为什么你可以做一个,但不能做另一个。@Gareth-我通常使用引号来避免列表应用程序。我不知道我有什么特别的原因。