eval-sv:ステップ実行

[トップ][一覧][最近の更新]



eval-svを使って、WiLiKi:Scheme:call/ccパズルを解いて?みる。

その一

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

続きはあとで。

応用

あとで。


最終更新 : 2008/03/31 23:31:56 JST