lisp - 应该是一个lambda表达式

时间:2014-03-04 04:51:29

标签: lisp clisp

我正在尝试从它所在的函数返回(值str((+ x 3)y))。

代码段:

(if (<my condition>)
    (values str ((+ x 3) y))
    (values str ((+ x 2) y)))

给出错误:

(+ X 3) SHOULD BE A LAMBDA EXPRESSION 

但是(values str (y (+ x 3)))工作正常。

为什么?

1 个答案:

答案 0 :(得分:6)

无法计算S表达式((+ x 3) y),因为第一个列表元素不是可执行的(它应该命名一个函数或者是一个lambda表达式)。

因此,为避免评估,您需要引用它:

(if (<my condition>)
    (values str '((+ x 3) y))
    (values str '((+ x 2) y)))

然后,您将返回长度为2的列表(包含长度为3的列表和符号y)作为第二个值。但是,如果您要在列表中返回(+ x 2)y,则需要执行类似

的操作
(values str (list (+ x (if <condition> 3 2)) y))

或者可能返回3个值而不是2:

(values str
        (+ x (if <condition> 3 2))
        y)

另一方面,y是一个符号,显然是在图像中命名一个函数,因此(y (+ x 3))计算得很好(它在添加的结果上调用函数y 3x)。