[Lisp処理系を作る] 12日目 設計の修正

作っている最中に問題が発生したので対処することにする。

問題

  1. Symbol クラスでインスタンスに値とセットで保持していた
    • 名前が一緒なら同じ値がbind されているようにするのに苦労する。
  2. 「List の car と cdr が nil」 ならそれを nil としていたが、それだと最後に nil がある場合の処理が出来ない。
    • List と nil を明確に区別する必要がある。
  3. 定数が無いので nil に値を束縛できる
    • 定数を用意する必要がある。

対処法

  1. Symbol クラスに値をセットにしない。
    • Symbol はあくまで名前のみ持つクラス
    • それに何が束縛されているのかは Env の(SymbolTable の)仕事とする。
  2. List を継承して Nil クラスを用意する。
    • Nil クラスのインスタンスのみ nil とする。
  3. SymbolTable クラスに定数の仕組みを導入する。
    • 通常の変数と被る部分があるのでそこは注意をする必要がある。