letrec の仕様を満たすように変更しよう

letrec の仕様

まずR6RSとしての letrec の仕様は

  • variable と同じ環境で init が評価される
  • init 評価の順序は未規定
  • 順序が未規定であることからも分かる通り、init での variable の直接参照・代入はエラーとしなければならない

である。


続いて現在の Mosh の仕様は

  • variable と同じ環境で init が評価される(仕様を満たす)
  • init 評価の順序は init の現れた順(仕様を満たす)
  • init での variable の直接参照・代入ができてしまう(★仕様を満たしていない)

という状態。

コード修正

方針は以下の通り。

  • letrec として合法・非合法なコードをそれぞれ用意する
  • pass1 でエラーチェックをする
  • まずは Mini Moshvm.scm)上で実装
;; OK
(letrec ([a (lambda () b)]
         [b (lambda () 3)])
  (display ((a)))
  (newline))

;; Error
(letrec ([a 3]
         [b a])
  (display b)
  (newline))


実装完了したが問題発生。コンパイラのエラーを正しく拾えていない。明日仕組みを考える。

letrec*

ちなみに letrec* に関してはR6RSとしては

  • variable と同じ環境で init が評価される
  • init 評価の順序は現れた順
  • 順序が自分よりも先の variable は init で参照可能

である。


現在の Mosh の仕様は

  • variable と同じ環境で init が評価される(仕様を満たす)
  • init 評価の順序は init の現れた順(仕様を満たす)
  • init での variable の直接参照・代入ができてしまう(★仕様を満たしていない)

という状態。

Outputz

2008/11/24 の Outputz
原稿用紙 27.7枚(11,069文字)

powered by Outputz.