`values` 在 Scheme 中是如何工作的?

Gra*_*ent 2 lisp scheme callcc apply r5rs

来自 R5RS 标准:

Values might be defined as follows:
(define (values . things)
  (call-with-current-continuation
    (lambda (cont) (apply cont things))))
Run Code Online (Sandbox Code Playgroud)

我对此的第一个解释是像这样的表达式(+ (values 1 2))等价于(apply + '(1 2))并且会产生结果3。但是,根据我的测试,这种解释是不正确的。这是我对上面代码的解释:values是一个带有任意数量参数的函数,捆绑到一个名为things. 然后,values使用things“未捆绑”列表调用当前的延续(使用的地方)。

我错过了什么?上面的示例(+ (values 1 2))根据我使用的解释器给出了错误或 1。

bip*_*pll 5

看,当你输入

(+ (values 1 2))
Run Code Online (Sandbox Code Playgroud)

对调用的延续values实际上是对 的单个参数+。因此,它要么被视为 1(列表的第一个元素,该过程产生的第一个值),要么被视为错误。R5RS 在这方面说:

除了由 call-with-values 过程创建的延续之外,所有延续都只取一个值。未指定不传递值或传递多个值到不是由 call-with-values 创建的延续的效果。

另一方面,call-with-values将您的列表元素正确绑定到其consumer参数的形式参数:

调用没有值的生产者参数和一个延续,当传递一些值时,使用这些值作为参数调用消费者过程。