【问题标题】:Convert a Scheme call-with-current-continuation to Common Lisp?将带有当前延续的 Scheme 调用转换为 Common Lisp?
【发布时间】:2016-08-27 17:35:34
【问题描述】:

我正在将一些 Scheme 代码转换为 Common Lisp。我不知道方案。我懂一点 Common Lisp。

这是方案代码:

(define (with-process-abortion thunk)
    (call-with-current-continuation
        (lambda (k)
            (fluid-let ((*abort-process* k))
                (thunk)))))

我对 Scheme call-with-current-continuation 函数做了一些阅读,但老实说,我不知道上面的函数在做什么。此时我对 Common Lisp 的转换非常简单:

(defun with-process-abortion (thunk)
    ;; No idea how to implement
    )

This SO post 说:

每次出现的 call/cc 都可以替换为以下内容 等效:

(lambda (f k) (f (lambda (v k0) (k v)) k))

其中 k 是要保存的延续, (lambda (v k0) (k v)) 是 恢复此延续的转义过程(无论 被调用时处于活动状态的延续 k0 被丢弃)。

好的,在我的情况下,f 对应的是什么? k 对应什么?

【问题讨论】:

    标签: scheme


    【解决方案1】:

    您通常无法解决这个问题,因为 Common Lisp 没有 call/cc 或任何实现“完整延续”的东西。但是,您可能可以转换此代码,因为 Scheme 实现似乎仅将 call/cc 用于非本地退出,而 Common Lisp 通过 catchthrow 以及重新启动来支持这一点。

    您可以尝试用

    替换 (with-process-abortion thunk) 的用法
    `(catch 'wpa #,thunk)
    

    并将(*abort-process*) 替换为(throw 'wpa nil)

    【讨论】:

    • 非常感谢@Doug Currie。我会试试看。
    • thunk 需要像 (defun with-process-abortion (thunk) (catch 'wpa (funcall thunk))) 一样调用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2011-10-17
    • 2018-11-15
    • 2011-04-20
    • 1970-01-01
    • 2014-09-03
    • 2019-04-18
    相关资源
    最近更新 更多