空想犬猫記

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

etolisp 進捗 (19) 〜 Package の実装 (2)

パッケージについてもう少し考えてみる。Paul Graham の本は package についてほんの3ページしか割かれていないが,その冒頭には

A package is a Lisp object that maps names to symbols.

とある。そう,Common-Lisp においてパッケージはオブジェクトなのだ。

(setf *package* (make-package 'mine :use '(common-lisp)))

のように,変数として利用できることを考えると,package は first class object として実装するのが妥当そうだったので,そう実装し直した。
ただ *package* の指すオブジェクトがカレントパッケージという仕様はけっこう気持ち悪かった。たとえば

(setf *package* 1)

と書くと Common-Lisp のランタイムはカレントパッケージが何だか分からなくなって,なにもできなくなる。

これは一見するとアホな仕様にも思えるんだけど,でもこういう仕様にすることで,その他の first class object と区別することなくpackage の実装ができるということなのかもしれない。考えようによってはドラクエの「もろはのつるぎ」みたいな強力なアイデアなのかもしれん。

ふと振り返ると,etolisp もパッケージのサポートまでしてしまった。パッケージ内のシンボルのエクスポートも using も自在。すごいのは Common-Lisp だけど,etolisp もすごくなってきた!