lisp - 应该是一个lambda表达式

b15*_*b15 0 lisp clisp

我试图从它所驻留的函数返回(值str((+ x 3)y)).

代码段:

(if (<my condition>)
    (values str ((+ x 3) y))
    (values str ((+ x 2) y)))
Run Code Online (Sandbox Code Playgroud)

给出错误:

(+ X 3) SHOULD BE A LAMBDA EXPRESSION 
Run Code Online (Sandbox Code Playgroud)

(values str (y (+ x 3)))工作正常.

为什么?

sds*_*sds 6

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

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

(if (<my condition>)
    (values str '((+ x 3) y))
    (values str '((+ x 2) y)))
Run Code Online (Sandbox Code Playgroud)

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

(values str (list (+ x (if <condition> 3 2)) y))
Run Code Online (Sandbox Code Playgroud)

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

(values str
        (+ x (if <condition> 3 2))
        y)
Run Code Online (Sandbox Code Playgroud)

在另一方面,y是一个符号,这很显然,在名称图像功能,使(y (+ x 3))计算罚款(它调用功能y上添加的结果3x).