我正在将一些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
)
每次出现的call / cc都可以替换为以下内容 当量:
(lambda(f k)(f(lambda(v k0)(k v))k))
其中k是要保存的继续,(lambda(v k0)(k v))是 恢复此延续的逃脱程序(无论如何 在被调用时处于活动状态的延续k0被丢弃。)
好的,f
在我的情况下会对应什么? k
对应的内容是什么?
答案 0 :(得分:5)
您通常无法解决此问题,因为Common Lisp没有call/cc
或任何实现"完整延续的内容。"但是,您可以转换此代码,因为看起来Scheme实现仅对非本地出口使用call/cc
,并且Common Lisp支持catch
和throw
,以及重启。
您可以尝试使用
替换(with-process-abortion thunk)
的使用
`(catch 'wpa #,thunk)
并将(*abort-process*)
替换为(throw 'wpa nil)