2009年2月2日月曜日

module, ACL defsystem, ASDF


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 件のコメント: