#:g1: ||パッケージの謎

Posted 2019-10-20 14:41:47 GMT

Common Lispのパッケージは名前を持ち、その名前は文字列となっています。
さて、それでは長さ0の文字列の場合、どのような挙動になるでしょうか。

ざっと調べてみました。

処理系 ""パッケージの扱い
LispWorks 7.1.2 ""パッケージ
Allegro CL 10.1 keywordパッケージ
Lucid CL 4.1 keywordパッケージ
CCL 1.11.5 ""パッケージ
CMUCL 21d ""パッケージ
CMUCL 17f ""パッケージ
SBCL 1.5.7 ""パッケージ
AKCL 1.619 ""パッケージ
GCL ""パッケージ
ECL ""パッケージ
MkCL ""パッケージ

Allegro CLと、Lucid CLは、(find-package "")でkeywordパッケージを返してきます。
パッケージ名の部分が空であればkeywordパッケージとする、という解釈もそれはそれで整合性がありそうではあります。

リーダーの読み取りの挙動が違っているのかと思いましたが、ちょっと調べてみたら、Allegro CLもLucid CLもニックネームに""が指定されているだけでした。

(package-nicknames :keyword)("")

ANSI CL規格を確認してみると、keywordパッケージのニックネームはnoneとなっていて拡張の余地がありそうな記述もないので、処理系の独自拡張ということになりそうです。

まとめ

なかなか面白い処理系拡張です。

(intern "X" "KEYWORD")
→ :x 
   :external 

よりも、

(intern "X" "")
→ :x 
   :external 

の方が直感的な気がしなくもありません。

(rename-package :keyword :keyword '(""))

によってお手軽に実現できますが、""パッケージが使えなくなるので注意しましょう(そんなパッケージ名使われないか)


HTML generated by 3bmd in LispWorks 7.1.2

comments powered by Disqus