eval バグ修正

call/cc が絡む以下のような eval が動かなかったので修正。

(eval
           '(let-syntax ([x (lambda (stx)
                              (datum->syntax
                               #'here
                               (condition-message
                                (call/cc
                                 (lambda (esc)
                                   (with-exception-handler
                                    (lambda (exn) (esc exn))
                                    (lambda ()
                                      (eval '(assertion-violation 'exptime "ok")
                                            (environment
                                             '(rnrs)
                                             '(rnrs eval))))))))))])
              x)
           (environment '(rnrs) '(for (rnrs eval) expand)))

元々 eval は手を抜いているのを認識しつつここまで来たがきちんと書き直したのですっきり。eval, apply は C++ 手続き(subr)として書かれている。実行すると、そっと pc を書き換えて(C++的な意味で) return していく控えめなところが好き。return した時点ではまだ処理は動いていないという感覚がふにょふにょ。

追記

../mosh tests/r6rs/run/eval.sps
Running tests for (rnrs eval)
3 tests passed