将一个Scheme call-with-current-continuation转换为Common Lisp?

时间:2016-05-02 20:32:49

标签: scheme

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

以下是Scheme代码:

(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对应的内容是什么?

1 个答案:

答案 0 :(得分:5)

您通常无法解决此问题,因为Common Lisp没有call/cc或任何实现"完整延续的内容。"但是,您可以转换此代码,因为看起来Scheme实现仅对非本地出口使用call/cc,并且Common Lisp支持catchthrow,以及重启。

您可以尝试使用

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

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