我试图从它所驻留的函数返回(值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)))工作正常.
为什么?
((+ 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上添加的结果3来x).