ASDFへの道。
まず、packageをおさらい。packageはそこそこわかっていることを確認。
続いて、module。moduleはわかっていない。
では、ansi CLのmodule。
-----------
*modules* :
現在のlisp imageにload済みのmoduleのリスト。文字列のリスト。
require module-name &optional pathname-list :
moduleに関連付けられたfilesをloadする。
pathname-listがnon-nilのときはそれをその順にloadする。
pachname-listがnilのときは、処理系依存の機構によってfilesをloadする。
provide module-name :
*modules*にmodule-nameが無ければそれを追加する。
あるmoduleが単一のpackageから構成される場合は、同じ名前にするのが
慣例である。
*modules*, require, provideはdeprecatedである。
-----------
続いてaclのmodule。
-----------
aclではmoduleという概念を活用している。
acl独自のdefsystemなる機構がありその中で定義されている。
defsystemはCLOSの上に構築されている。
souceとfaslのa pairをmoduleと呼ぶ。foo.lisp、foo.faslであれば、
module名は"foo"。
module-groupは、modulesやmodule-groupsの集りである。
systemは、module-groupsから構成される。systemは名前を持つ。
moduleの定義はdefsystemにて行なう。defsystemの中のmoduleに関する記
述をmodule-specificationsと呼ぶ。
module-specificationによって、moduleの定義およびmodule間の依存関係
を定義する。また、module-groupsを定義する。
defsystemで定義したsystemに対して、
load-system
compile-sytem
map-system
などのpredefined operationsを利用できる。require, provideはこの
defsystemとしては振舞いは定義されていない。おそらく機能として直交し
ているのだろう。
aclでapplicationをbuildして配布するときなどに便利そうだ。
OSSコミュニティでは使われていないようだ。
-----------
aclにおけるrequireはどうなっているだろう。
どうやら、
sys:*require-search-list*
に含まれるpathnameに合致するファイルとカレントディレクトリのfaslが、
(require 'hoge)でロードされるようだ。ただし、例えばカレントディレク
トリにて自分で作成したfaslをrequireしたい場合は、あらかじめprovide
によって名前を*modules*に登録しておく必要がある。
さて、ASDF。
つ http://cclan.cvs.sourceforge.net/*checkout*/cclan/asdf/README
----
ASDFはソースファイル間の依存関係を記述するものである。
asdファイルの置き場所は、asdf:*central-registry*。
これは*default-pathname-defaults*を含んでいる。
ASDFの中心概念は、componentsとoperationsである。
systemsはcomponentsから構成される。
a component は a source fileまたは、a collection of componentsの表
現である。
結果としてa systemは、componentsとsource filesをnodeとする木構造を
成す。
Operationsはその木構造に作用する処理である。
なるほど。すると、'asdf:load-opしたときにどう処理が進むか(asdファ
イルの記述がどう評価されるか)はOperationを調べればいいんだな。
ただ、このREADMEには記述がない。
つ /Applications/AllegroCL/src/asdf.lisp
ソースをみる。
operateを呼ぶと、find-systemする。find-systemは、systemがin memory
かどうかin memoryだとして
(*defined-systems*に登録されているとして)、更新日付の関係はどうかを
みて、必要があれば、asdファイルをloadする。asdファイルの中の
defsystemはregister-systemを呼んで、systemを登録する。
なるほど。ASDF的には、asdファイルの必須坦務はregister-systemするこ
とだけのようだ。必要に応じてそれ以外の処理が必要であれば、そこで書
いてしまってもよいようだ。asd自体は単にloadされるだけなので、普通
にそれらは評価される。
----
runesを読む準備が整ったかなぁ。
こつこつ。
0 件のコメント:
コメントを投稿