【问题标题】:Can the function argument to `call/cc` equivalently either invoke the continuation or return without invoking the continuation?`call/cc` 的函数参数是否可以等效地调用延续或在不调用延续的情况下返回?
【发布时间】:2019-12-17 17:07:06
【问题描述】:

Scheme 编程语言说

方案允许使用过程call/cc 捕获任何表达式的延续。 call/cc 必须通过一个参数的过程pcall/cc 构造当前的具体表示 继续并将其传递给p。延续本身由过程k 表示。每次应用k 为一个值,它将该值返回给call/cc 应用程序的延续。这个值变成,在 本质,应用call/cc的价值。 如果p没有调用k就返回了,那么程序返回的值就变成了应用程序的值 call/cc.

call/cc的调用而言,以下两种定义p的方式是否等效:

  • p 不调用 k 就返回,
  • p 调用 k 并返回值?

我不确定call/cc 是如何定义的。 除了通过p 间接调用k 之外,call/cc 是否曾直接调用延续k

call/ccp 都不调用延续 k 是否完全正常?

【问题讨论】:

    标签: scheme continuations continuation-passing callcc


    【解决方案1】:

    是的,(call/cc (lambda (k) 1)) <=> (call/cc (lambda (k) (k 1)))。您可以通过使用延续传递样式转换来证明这一点。

    关键部分是call/cc的CPS形式是(lambda (k) (lambda (f) ((f k) k)))。而这两个函数的CPS形式分别是(lambda (c) (lambda (k) (c 1)))(lambda (c) (lambda (k) (k 1)))。替换和简化,都得到(lambda (k) (k 1))

    我非常喜欢带分隔符的延续:

    (reset (1 + (shift (lambda (f) f)))) <=> (lambda (v) (+ 1 v))
    

    这也可以用代数证明。

    【讨论】:

    • 谢谢。你如何使用延续传递样式变换证明(call/cc (lambda (k) 1)) &lt;=&gt; (call/cc (lambda (k) (k 1)))
    【解决方案2】:

    要解决后续问题的详细信息,我们可以使用来自http://matt.might.net/articles/cps-conversion/ 的代码 scheme-cps-convert.rkt

    > (T-c '(call/cc (λ (k) 1)) 'halt)
    '((λ (f cc) (f (λ (x _) (cc x)) cc)) (λ (k $k2873) ($k2873 1)) halt)
    > (T-c '(call/cc (λ (k) (k 1))) 'halt)
    '((λ (f cc) (f (λ (x _) (cc x)) cc)) (λ (k $k2940) (k 1 $k2940)) halt)
    

    减少第一个表达式:

      ((λ (f cc) (f (λ (x _) (cc x)) cc)) (λ (k $k2873) ($k2873 1)) halt)
    = ((λ (k $k2873) ($k2873 1)) (λ (x _) (halt x)) halt)
    = (halt 1)
    

    第二个

      ((λ (f cc) (f (λ (x _) (cc x)) cc)) (λ (k $k2940) (k 1 $k2940)) halt)
    = ((λ (k $k2940) (k 1 $k2940)) (λ (x _) (halt x)) halt)
    = ((λ (x _) (halt x)) 1 halt)
    = (halt 1)
    

    证明它们是相等的,所以在那个位置使用 k 或不使用 k 没有区别。

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 2011-02-16
      • 2016-01-18
      • 2017-01-22
      • 2016-12-11
      • 2019-12-14
      • 1970-01-01
      • 2015-01-06
      • 2012-10-07
      相关资源
      最近更新 更多