2016-05-02 6 views
4

Ich konvertiere einen Scheme-Code in Common Lisp. Ich kenne Scheme nicht. Ich kenne ein bisschen Common Lisp.Convert eine Scheme-Call-with-Current-Fortsetzung zu Common Lisp?

ist die Scheme-Code:

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

ich auf dem Schema call-with-current-continuation Funktion etwas zu lesen habe aber, ehrlich gesagt, ich habe keine Ahnung, was die obige Funktion tut. Meine Umstellung auf Common Lisp ist sehr Skelett zu diesem Zeitpunkt:

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

This SO post sagt:

jedes Vorkommen von Call/cc kann mit dem folgenden gleichwertig ersetzt werden:

(Lambda (fk) (f (lambda (v k0) (kv)) k))

wo k ist die Fortsetzung gespeichert werden soll, und (Lambda (v k0) (kv)) ist der escap Die Prozedur, die diese Fortsetzung wiederherstellt (was auch immer Fortsetzung k0, die aktiv ist, wenn es aufgerufen wird, wird verworfen).

Okay, was würde f in meiner Situation entsprechen? Was würde k entsprechen?

Antwort

5

Sie können dieses Problem nicht allgemein lösen, da Common Lisp nicht über call/cc oder irgendetwas verfügt, das "vollständige Fortsetzungen" implementiert. Sie können diesen Code jedoch wahrscheinlich konvertieren, da die Implementierung von Scheme anscheinend nur für nicht lokale Exits call/cc verwendet und Common Lisp dies mit catch und throw sowie mit Neustarts unterstützt.

Sie könnten versuchen, eine Verwendung von (with-process-abortion thunk) mit

`(catch 'wpa #,thunk) 

und ersetzen (*abort-process*) mit (throw 'wpa nil)

+0

Vielen Dank @Doug Currie zu ersetzen. Ich werde es versuchen. –

+1

'thunk' muss wie' 'defun with-process-abortion (thunk) aufgerufen werden (catch 'wpa (funcall thunk)))' – Sylwester

+0

Danke @Sylwester! –