空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

etolisp 進捗 (20) 〜 Package (3)

追記:このエントリは誤っている可能性が高いです。
前々回前回の実装は,parse 時にシンボルの値を決定していたが,それはやってはならないことだった。というのも,Common-Lisp では動的に active なパッケージを切り替えることができるので,パースした構文木と,実際に実行されるコードは必ずしも常に同じではない。たまたま今までは,一行一行パースして実行するinteractiveなモードでしかテストしてなかったので気付かなかったが,今日テストコードを書いて,普通に実行したら全然うごかなくて気付いた次第…。

結局,パース時に決定するシンボルの名前(文字列),それと一対一に対応するシンボル(数値),さらにパッケージの名前空間つきのシンボル(qualified symbol; qymbol・笑)が必要で,qymbol は symbol が評価されるコンテキストが完全に決定したあとで,毎回,評価して取得しなければならない。愚直に,一番シンプルに実装すると,一つのシンボル名が解決するまでに

  1. common-lisp::*package* の値(カレントパッケージ)を取得(common-lisp::*package* の qymbol は常に定数)
  2. カレントパッケージを使って symbol から qymbol に変換
  3. qymbol からランタイムに保存されている qymbol table(シンボルテーブル)を使って値を取得

という3段階が必要になってしまう。シンボルの検索がおよそ当社比3倍遅くなるわけだ。残念。

や : を使った変数のアクセスも,動的に解決するということで,やや面倒になる。それなりに良さげなアイデアがあって,既に実装も終わったけど,今日のところは疲れたのでまた後で書くことにする。名前空間のネストという概念がなくてちょっと助かったかな。