gaucheでのエラー
現在SICPの4.3に取り組んでいる.
この4.3ではamb評価器を実装して,問題を解くのだが,さっきまでどうしてもうまく動かなかった.
動かなかったプログラムは以下のもの.
(define (require p) (if (not p) (amb))) (define (hoge n) (let ((a (amb 1 2 3 4))) (require (not (= a 1))) (* a n))) (hoge 3)
これをamb評価器で実行すると,
;;; Amb-Eval input: *** ERROR: unbound variable: env Stack Trace:
envが定義されていない?そんなはずはない!と思って,一度端から端まで見たが特に問題は見当たらない.
うーん..は?!まさか...よくenvをevnと打ち間違えるぞ.......Ctrl-s evn......いた!お前か!analyze-sequence!!
analyze-sequenceの実装は
(define (analyze-sequence exps) (define (sequentially a b) (lambda (env succeed fail) ;<- ここがevnになっていた (a env ;;success continuation for calling a (lambda (a-value fail2) (b env succeed fail2)) ;;failure continuation for calling a fail))) (define (loop first-proc rest-procs) (if (null? rest-procs) first-proc (loop (sequentially first-proc (car rest-procs)) (cdr rest-procs)))) (let ((procs (map analyze exps))) (if (null? procs) (error "Empty sequence -- ANALYZE")) (loop (car procs) (cdr procs))))
gauche(scheme全体に言える?)では,analyze-sequenceのように,lambdaで定義されている変数を,そのlambda内で使おうとして,変数名が間違えてしまうと,上のようにとても簡素なエラーしか表示されない.これは見つけるのが本当に大変.特に打ち間違えの多い私はこれに苦しむ.せめてどの関数内でのエラーかわかる方法はないのかな...