gpt4 book ai didi

ruby - CPS 风格的 `call/cc` 可以用假设的非 CPS 风格的 `cc' 来写吗?

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:20 25 4
gpt4 key购买 nike

使用支持延续的语言,例如Scheme、Ruby 和 Haskell,假设有一个函数 cc' 不带参数并返回当前延续,以便通过调用 cc' 获得延续的调用者然后可以随心所欲地在任何地方调用延续。

cc' 可以按照 CPS 风格的 call/cc 来编写,通过将身份函数作为参数传递给 call/cc.

相反,CPS 风格的call/cc 是否可以用非CPS 风格的cc' 来编写?

最佳答案

这是我的尝试(警告:我是一个没有经验的策划者)。让 get-cc 成为返回当前延续的函数。

(define (get-cc)
(call-with-current-continuation (lambda (k) k)))

然后,我们可以定义:

(define (callCC f)
(let ((w (get-cc)))
(if (pair? w)
(car w)
(f (lambda (x) (w (cons x '())))))))

第一次调用此函数时,w 绑定(bind)到当前延续。所以,(pair?w) 是假的,我们调用 f 继续 (lambda (x) (w (cons x '())).

w 通过 f 调用时(带有参数 (cons x '())),那么 的主体let 再次输入,其中 w 现在绑定(bind)到 (cons x '())。现在,(pair?w) 为真,我们可以返回 (car w),即 x

pair wrapper 用于区分什么是“f 的延续”和“from f 的结果”,所以说话。

快速测试表明这是有效的,但我对它的正确性并不完全有信心。

您可能注意到 w 绑定(bind)到不同类型的值。这就是为什么我求助于 Scheme 之类的无类型语言而不是 Haskell 的原因。

关于ruby - CPS 风格的 `call/cc` 可以用假设的非 CPS 风格的 `cc' 来写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57361469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com