有人可以帮助我使用 common-lisp 代码吗?

问题描述 投票:0回答:1

以下带有数字 2 和 3 的 common-lisp 代码中会发生什么:

"(values (values 1 2 3) 4 5)"

输出为:1 4 5。

另一个论坛中的有人向我解释说,“值 2 和 3 被有效地丢弃,因为外部“(values ...)”调用只关心内部“(values 1 2 3)”调用的第一个值。

我的问题是,为什么会发生这种情况?

common-lisp
1个回答
0
投票

values
是一个函数。对于 CL 中名为 f 的函数,则
(
f v1 v2 ...
)
:

  • 按顺序评估每个 v1v2...,从每个值中收集一个值,可以是第一个值,或者如果没有值则
    nil
  • 使用这些值调用 f

这解释了为什么

(values (values ...))
仅从内部
values
调用中选择第一个值。

如果您想收集所有值,您需要一种特殊的形式,其中不遵循正常的函数调用语义。 CL 提供了一个特殊的运算符,可以让您编写这样的形式:

multiple-value-call
,诀窍是特殊形式中的函数参数应该是
values
本身:

> (multiple-value-call #'values (values 1 2 3) 4 5)
1
2
3
4
5
* 
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.