我正在尝试从它所在的函数返回(值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)))
工作正常。
为什么?
答案 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
3
至x
)。