2016-05-02 19 views
4

私はいくつかのSchemeコードをCommon Lispに変換しています。私はスキームを知らない。私はCommon Lispのことを少し知っています。ここでScheme call-with-current-continuationをCommon Lispに変換しますか?

は、Schemeコードです:

(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は言う:

コール/ ccでの全ての発生は、以下の 同等に置き換えることができます:

(ラムダ( k)は保存される継続であり、(λ(v k0)(kv))は エスケープであるこのプロシージャを呼び出すときにアクティブになっている何らかの 継続k0が復元されます。

いいえ、私の状況ではfはどうなりますか? kは何に対応しますか?

答えて

5

Common Lispにcall/ccや「完全継続」を実装していないため、一般的にこの問題を解決することはできません。 Schemeの実装ではローカル以外の出口に対してのみcall/ccが使用されているようで、Common Lispはこれをcatchthrowで、また再起動でサポートしているため、おそらくこのコードを変換できます。

あなたは

`(catch 'wpa #,thunk) 

(with-process-abortion thunk)の使用を交換しようとすると、(throw 'wpa nil)

+0

(*abort-process*)を置き換えることができ、非常に多くの@Dougカリーありがとうございます。私はそれを試してみましょう。 –

+1

'thunk'は'のように呼び出す必要があります。(プロセスの中断(サンク)(catch 'wpa(funcall thunk))) ' – Sylwester

+0

ありがとう@Sylwester! –

関連する問題