【问题标题】:How does `values` work in Scheme?`values` 在 Scheme 中是如何工作的?
【发布时间】:2018-09-13 09:15:01
【问题描述】:

来自 R5RS 标准:

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

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

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

【问题讨论】:

  • 我认为您缺少的是 + 不是延续。

标签: scheme lisp apply r5rs callcc


【解决方案1】:

看,当你输入

(+ (values 1 2))

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

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

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

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

【讨论】:

  • 啊,我明白了!我测试了(+ (values 1)),它在给(+ (values 1 2)) 一个错误的解释器中工作。
【解决方案2】:

为了理解values 的定义意味着什么,您还需要理解call-with-current-continuation 的定义,它是根据它来定义的。有用的是,values 的文档提到了call-with-values,作为如何使用values 的结果的示例。

因此,您可以在如下上下文中使用(values 1 2)

(call-with-values (lambda () (values 1 2))
                  (lambda (x y) (+ x y)))

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多