2015/12/23

varとvalを間違えてはまった話

ちょっとしたミスにかなり時間取られました.
スコープがどうなってるか調べようと色々手続き作ろうしていたらよくわからないエラーが出てしまい.
はじめはappって名前のlambda式をdefineするとエラーが出るっていうよくわからない症状で.
途中でmy-applyからのエラーだとわかり,その後,何度か環境を評価し直したりしていて, 同じ変数名でdefineした時に正しくvalueが環境に保存されていないことに気付きました.
下に書いたようにvarとvalの違いが原因でした.
これのせいで二時間くらい取られました.
環境の中を覗いても,何が期待した状態なのかをなかなか読み取れなかったのも時間がかかった原因の一つですね.
自分のために残しておきます.
でもまだこの段階で気付けてよかったです.

(define (define-variable! var val env)
  (let ((frame (first-frame env)))
    (let ((target (scan var (frame-variables frame) (frame-values frame)
                        (lambda (var vars vals) vals))))
      (if target
          (set-car! target var)  ;;ここのvarが間違い
          (add-binding-to-frame! var val frame)))))
(define (define-variable! var val env)
  (let ((frame (first-frame env)))
    (let ((target (scan var (frame-variables frame) (frame-values frame)
                        (lambda (var vars vals) vals))))
      (if target
          (set-car! target val) ;; valに修正
          (add-binding-to-frame! var val frame)))))

© 2022 wat-aro