作りました。
package-inferred-system
って何
簡単に言うと・・・
- Common Lispではパッケージ名(言語上での名前空間)とモジュール(コンパイルする単位)とが分離しています
- 言い換えると,同じファイルにパッケージを複数入れる,といったことができます
- このため,パッケージ名からモジュールのパスを推測できません
- このためビルドする際は手動でファイル同士の依存関係を記述するか,全て1つのでかいファイルに収める必要がありました
- 規約としてパッケージ名とモジュール名とを1対1で対応付けたら依存関係書く必要ないじゃん,という発想で生まれたのが
package-inferred-system
です
依存しているパッケージ名からビルドするべきファイル名が自明に定まるので,PerlのようにカジュアルにCommon Lispが書ける,というわけです。
package-inferred-system
むずかしい
あまり解説がないので使いこなすのが難しい状態でした。かれこれ2年ほど苦心していました。
ASDF3でパッケージを推測して定義する現代的な方法。 / “How to write a modern Lisp library with ASDF3 and Package Inferred System | David V…” https://t.co/biP0tkrdMn
— Windymelt (@windymelt) 2017年8月25日
#CommonLisp の #asdf3 で使える package-inferred-systemの命名規則は.asdファイルと同じ場所にソースを置く前提になっていて、src/以下にソースがある場合は使いづらそうに思える。命名のルートをsrc以下に設定できないだろうか?でなければパッケージ名が皆 src/hogepackage になってしまう。
— Windymelt (@windymelt) 2017年12月27日
今日こそpackage-inferred-systemやるぞとおもったが,多くのプロジェクトではsrc/以下にソースファイルが収められている.だったらパッケージ名は :src/foo にするしかないのだろうか.perlみたいに,:project/package/foo が src/package/foo.lispと対応するようにできないだろうか.
— Windymelt (@windymelt) 2018年5月30日
みんなもどしどし #CommonLisp困りどころ を投稿しよう!!!!! / “Common Lisp困りどころ その1: `package-inferred-system` - Lambdaカクテル” (1 user) https://t.co/sbeClXAlvs
— Windymelt (@windymelt) 2018年6月29日
ASDFのpackage-inferred-systemまじでわからんな,俺がやりたいことは依存関係を自動解決するLLライクなパッケージの組み立てなのに,all.lispみたいな謎概念やuiop:define-packageが導入されたりして謎
— Windymelt (@windymelt) 2018年11月19日
package-inferred-systemわかったぞ
— Windymelt (@windymelt) 2018年11月19日
どこからも明には呼ばれていないパッケージは,package-inferred-systemはコンパイルから漏れてしまう.たとえばこれが,他のパッケージのスペシャル変数に定義を追加するようなマクロを含むようなパッケージの場合,依存性の定義のためだけに:import-fromを使わなければならない
— Windymelt (@windymelt) 2018年11月20日
package-inferred-systemちゃんと動かない問題,asdfのバージョンのせいでは,というきがしてきた・・・
— Windymelt (@windymelt) 2019年2月24日
Common LispのPackage-inferred-systemにようやく勝てるかもしれない
— Windymelt (@windymelt) 2019年12月27日
なんでむずかしいのか
完全なサンプルがないからです。こう書いたら良いよ,というコードスニペットはあるにはあるのですが,入門者が使うにはかなり敷居が高いものになっていました。自己完結していて動作するサンプルプロジェクトを用意する必要がありました。
そこで今回github projectを作成し,動作するpackage-inferred-system
サンプルを公開しました。初学者の参考になれば幸いです。また,Common Lispプロジェクトの近代化*1の礎になればと思います。
感想
- 後で困らないように,また応用しやすいように,コメントをちゃんと付けています。
- デフォルトでは
.asd
ファイルと同階層になってしまうソースファイルのパスをsrc/
といった場所に移動させる:pathname
機能というのがあるのですが,これがうまく動作したのが一番の喜びでした。
参考文献
*1:今風に扱えるようにする,とも言う