Why common lisp package is difficult.
Meta note.
対象読者
- Common Lispのpackageシステムわかりづらい初心者CLer
Reason.
Common LispのPackageシステム(名前空間管理システム)は他言語の同機能とは設計が異なります。 ですので他言語の名前空間管理システムへのメンタルモデルのままCommon LispのPackageシステムを解釈しようとすると歪みが生じます。 これが初学者をしてCommon LispのPackageシステムを難解なものとしている理由となります。
Namespace model.
多くの言語が採用している名前空間管理モデルは一番外側にグローバルな名前空間があり、その内側に名前空間を区切るというものです。
グローバルな名前空間には言語により予約されたキーワードがあります。
名前空間から予約語は見えます。
他の名前空間は見えません。
Package system model.
他言語の名前空間モデルがウィンドウの分割に相当するなら、Common LispのPackageシステムはタブウィンドウに相当します。 Package(名前空間)は全て並列に存在します。
IN-PACKAGE
でタブを切り替えると見えるシンボルが変わります。
上に見てきたようにCommon Lispにはグローバルな名前空間というものが存在しません。 よって予約語というものも存在しません。
Common Lispという言語が提供するシンボルは全てCOMMON-LISP
パッケージに所属しています。
言語仕様によりLisp Runtimeを立ち上げたときに最初に入っている名前空間(package)はCL-USER
であると決まっています。
そしてCL-USER
パッケージはCOMMON-LISP
パッケージを使用(USE)してあるものと定められています。
これはすなわちCOMMON-LISP
パッケージを使用(USE)しなければCAR
もCDR
もできないパッケージを作ることが可能であることを意味します。
これを他言語で例えるなら、if
による条件分岐もfor
によるループもできない名前空間を作るに相当します。
その場合でも、もちろん、明示的にパッケージ名をプリフィックスとして指定すれば参照は可能ですが。
Conclusion.
ハマりどころは他にもあるのですがそもそものモデルの違いを解説している記事は見たことがなかったので書いてみました。 初学者の方の一助となれば幸い。