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。
看,当你输入
(+ (values 1 2))
Run Code Online (Sandbox Code Playgroud)
对调用的延续values实际上是对 的单个参数+。因此,它要么被视为 1(列表的第一个元素,该过程产生的第一个值),要么被视为错误。R5RS 在这方面说:
除了由 call-with-values 过程创建的延续之外,所有延续都只取一个值。未指定不传递值或传递多个值到不是由 call-with-values 创建的延续的效果。
另一方面,call-with-values将您的列表元素正确绑定到其consumer参数的形式参数:
调用没有值的生产者参数和一个延续,当传递一些值时,使用这些值作为参数调用消费者过程。
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |