解析Common Lisp列表中的符号

时间:2010-11-18 17:09:02

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

2 个答案:

答案 0 :(得分:6)

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

CL-USER> (trimmer (list 1 2 3 var1 var2))
(2 3 value-of-var1)

(其中value-of-var1var1)的值。

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)
然而,这似乎是一件奇怪的事情。你能说一下你想要达到的目标吗?几乎可以肯定,有一种比这更好的方法。