(use eval-sv) (define-values (eval/sv env) (make-eval/sv :isolate-port? #f)) (define *cont* #f) (define (sv type symbol expr args return except) (let/cc cont (set! *cont* cont) ;; 人間が確認する目的で、↓の値を返す (return (cons (or symbol expr) args))) (apply expr args)) (eval/sv '(let* ((yin ((lambda (foo) (newline) foo) (call/cc (lambda (bar) bar)))) (yang ((lambda (foo) (write-char #\*) foo) (call/cc (lambda (bar) bar))))) (yin yang)) sv)
あとは、
(*cont*)
を実行する毎に、ステップ実行される。
(この、1ステップ毎に継続を取り出して保存するやり方は、S式バトラーで、スレッド的に二人のキャラクターを行動させる手段としても利用している。)
人間が頭の中でこのコードを評価する場合も、おそらく1ステップずつ実行?しつつ、それが正しいかどうかを一つずつ検証していくものと類推できる。 という事は、同じアルゴリズムで疑似AIにコードを書かせたり検証させたりするのであれば、eval-svはそれなりに役立つのではと思われる。
その一で、1ステップ毎の継続が取り出せる事が分かったので、以下の点を強化してみる。
続きはあとで。
あとで。