(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ステップ毎の継続が取り出せる事が分かったので、以下の点を強化してみる。
続きはあとで。
あとで。