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 もすごくなってきた!