letrec の仕様を満たすように変更しよう
letrec の仕様
まずR6RSとしての letrec の仕様は
- variable と同じ環境で init が評価される
- init 評価の順序は未規定
- 順序が未規定であることからも分かる通り、init での variable の直接参照・代入はエラーとしなければならない
である。
続いて現在の Mosh の仕様は
- variable と同じ環境で init が評価される(仕様を満たす)
- init 評価の順序は init の現れた順(仕様を満たす)
- init での variable の直接参照・代入ができてしまう(★仕様を満たしていない)
という状態。
コード修正
方針は以下の通り。
;; OK (letrec ([a (lambda () b)] [b (lambda () 3)]) (display ((a))) (newline)) ;; Error (letrec ([a 3] [b a]) (display b) (newline))
実装完了したが問題発生。コンパイラのエラーを正しく拾えていない。明日仕組みを考える。