代码之家  ›  专栏  ›  技术社区  ›  Roger Costello

是否将当前延续的Scheme调用转换为Common Lisp?

  •  5
  • Roger Costello  · 技术社区  · 9 年前

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

    以下是方案代码:

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

    我读了一些关于计划的书 call-with-current-continuation 但是,老实说,我不知道上面的函数在做什么。目前,我对Common Lisp的转换非常简陋:

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

    This SO post 说:

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

    (λ(f k)(fλ(v k0)(k v))

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

    好吧,什么会 f 符合我的情况?什么会 k 对应于?

    1 回复  |  直到 8 年前
        1
  •  5
  •   Doug Currie    9 年前

    一般来说,您无法解决此问题,因为Common Lisp没有 call/cc 或者任何实现“完整延续”的代码。但是,您可能可以转换此代码,因为Scheme实现似乎正在使用 呼叫/抄送 仅适用于非本地出口,Common Lisp支持 catch throw ,以及重新启动。

    您可以尝试替换 (with-process-abortion thunk) 具有

    `(catch 'wpa #,thunk)
    

    并更换 (*abort-process*) 具有 (throw 'wpa nil)