Why common lisp package is difficult.

Meta note.

対象読者

Reason.

Common LispのPackageシステム(名前空間管理システム)は他言語の同機能とは設計が異なります。 ですので他言語の名前空間管理システムへのメンタルモデルのままCommon LispのPackageシステムを解釈しようとすると歪みが生じます。 これが初学者をしてCommon LispのPackageシステムを難解なものとしている理由となります。

Namespace model.

多くの言語が採用している名前空間管理モデルは一番外側にグローバルな名前空間があり、その内側に名前空間を区切るというものです。

“Namespace example1.”

グローバルな名前空間には言語により予約されたキーワードがあります。

“Namespace example2.”

名前空間から予約語は見えます。

“Namespace example3.”

他の名前空間は見えません。

“Namespace example4.”

Package system model.

他言語の名前空間モデルがウィンドウの分割に相当するなら、Common LispのPackageシステムはタブウィンドウに相当します。 Package(名前空間)は全て並列に存在します。

“Package example1.”

IN-PACKAGEでタブを切り替えると見えるシンボルが変わります。

“Package example2.”

上に見てきたようにCommon Lispにはグローバルな名前空間というものが存在しません。 よって予約語というものも存在しません。

Common Lispという言語が提供するシンボルは全てCOMMON-LISPパッケージに所属しています。

“Package example3.”

言語仕様によりLisp Runtimeを立ち上げたときに最初に入っている名前空間(package)はCL-USERであると決まっています。 そしてCL-USERパッケージはCOMMON-LISPパッケージを使用(USE)してあるものと定められています。

これはすなわちCOMMON-LISPパッケージを使用(USE)しなければCARCDRもできないパッケージを作ることが可能であることを意味します。 これを他言語で例えるなら、ifによる条件分岐もforによるループもできない名前空間を作るに相当します。

その場合でも、もちろん、明示的にパッケージ名をプリフィックスとして指定すれば参照は可能ですが。

Conclusion.

ハマりどころは他にもあるのですがそもそものモデルの違いを解説している記事は見たことがなかったので書いてみました。 初学者の方の一助となれば幸い。

References.

あわせて読むならこちらの記事もどぞ。