さかもとのブログ

つらつらと

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内で使おうとして,変数名が間違えてしまうと,上のようにとても簡素なエラーしか表示されない.これは見つけるのが本当に大変.特に打ち間違えの多い私はこれに苦しむ.せめてどの関数内でのエラーかわかる方法はないのかな...