以下带有数字 2 和 3 的 common-lisp 代码中会发生什么:
"(values (values 1 2 3) 4 5)"
输出为:1 4 5。
另一个论坛中的有人向我解释说,“值 2 和 3 被有效地丢弃,因为外部“(values ...)”调用只关心内部“(values 1 2 3)”调用的第一个值。
我的问题是,为什么会发生这种情况?
values
是一个函数。对于 CL 中名为 f 的函数,则 (
f v1 v2 ...)
:
nil
;这解释了为什么
(values (values ...))
仅从内部 values
调用中选择第一个值。
如果您想收集所有值,您需要一种特殊的形式,其中不遵循正常的函数调用语义。 CL 提供了一个特殊的运算符,可以让您编写这样的形式:
multiple-value-call
,诀窍是特殊形式中的函数参数应该是 values
本身:
> (multiple-value-call #'values (values 1 2 3) 4 5)
1
2
3
4
5
*