2017-03-11 3 views
1

私はscheme interpreter in scalaを書いていますが、実際には機能しますが、サブルーチン間の切り替え方法はまだ分かりません。例えば :2つのサブルーチンからどのようにcall/ccがジャンプするのですか

(call/cc 
(lambda (k) 
    (k 1) 
    (display 2))) 

私は表示手順を実行しなければならないと仮定したが、それはしていません。 Javaで

、それだけで何かがこれを好き:

public class Test { 

    static void call_cc(Consumer<Consumer> k,Consumer current){ 
     k.accept(current); 
    } 

    public static void main(String[] args){ 
     call_cc(consumer -> { 
      consumer.accept(1); 
      System.out.println(2); 
     },System.out::print); 
    } 
} 

ので、私の意見に問題が何ですか?

答えて

2

call/ccは、プログラムを継続渡しスタイルに書き換えます。 CPS call/cc

(display (call/cc 
(lambda (k) 
    (k 1) 
    (display 2)))) 
(display "finished") 

がこの以上のものではありません:

私はあなたがそれのこつを得ることができるようにした後、コードの結果を表示し、追加のコードを持っていることが少し変わってきました、ここに私の変形例であり、使用
(define (call/cc& f continuation) 
    (define (exit value actual-continuation) 
    (continuation value)) 
    (f exit continuation) 

exit関数 は、CPSでのプログラムの残りの部分を表す閉鎖を取得しますが、その主な機能は、付属の代わりにそれ自身の継続を使用することです。

私はあなたのコードの書き換えのための今すぐdisplayのCPS-バージョンと、最終的な継続関数halt

; CPS version of display 
(define (display& s k) 
    (display s) 
    (k 'undefined)) 

; The final continuation 
; We make the REPL get the result and it display it 
(define halt values) 

を定義します。 CPSソートは、各ステップで1つだけを計算するステップ・プロセスにコードを変更し、Schemeでは評価の順序はこのフォームでの実装までですが、その順序は非常に明確に示されます。ちょうど尾の位置に継続を呼び出して、それは決して戻らないことに注意してください:

; CPS version of the code 
(call/cc& 
(lambda (exit continuation) 
    (exit 1 
     (lambda (unused) 
      (display& 2 continuation)))) 
(lambda (value) 
    (display& value 
      (lambda (unused) 
       (display& "finished" halt))))) 

を今、あなたは、このステップスルーあれば、それは「2」を表示することはありません、なぜそれは明らかです。

関連する問題