Next: , Previous: , Up: Top   [Contents][Index]


7 ASDFのオブジェクトモデル

ASDFは、全体がオブジェクト指向でデザインされています。システムの構造も、システムに対するオペレーションも、拡張可能なプロトコルに従っているので、プログラマはASDFに新しい機能を加えることができます。例えば、cfficffi-grovelというASDF拡張によって、Cライブラリへのインターフェースの記述ファイルや、LispにCコードを埋め込むラッパーファイルを扱うコンポーネント型(それぞれcffi-grovel-filecffi-wrapper-file)を追加し、ABCL提供のasdf-jarはJavaのJARアーカイブを作る機能をもたらし、poiuはバックグラウンドプロセスを使って並列ビルドを可能にします。

ASDFの最も基本的なクラスはcomponentoperationです。componentが表すのは、1つのソースファイルか、複数のソースファイルのまとまりか、あるいはそれらから生み出されるもの(faslファイルなど)です。operationはコンポーネントに対して行われる何らかの変換であり、コンポーネントを中間結果や最終的な生成物に変えます。コンポーネント同士は依存関係によって関係づけられていて、それはシステム定義の中で指定されます。

operateによってコンポーネント(たいていはシステム)に対するオペレーションを指示したとき、ASDFはまずmake-plan関数を使って、依存関係を調べ、処理全体の計画(plan)を建てます。22 make-planの返すplanオブジェクトは実行すべきアクション(action)の順序付きリストを含んでいます。アクションとはoperationcomponentのペアであり、ビルドの1ステップとしてperformされるものです。また、このアクションのリストは、どのアクションも必要な依存関係が満たされるまでは実行されないことを保証します。23

この章では我々は、ASDFのオブジェクト指向プロトコル――プロトコルを構成するクラスと、それに対する総称関数――について解説します。これらの総称関数は多くの場合、コンポーネントとオペレーションの両方を引数に取ります。CLOSの多重ディスパッチを利用することで、ASDFは強力な機能を持ち、設定が柔軟に変更できるようになっています。我々は、まず組み込みのコンポーネントとオペレーションについて解説し、さらに新しいクラスやメソッドを定義してASDFプロトコルを拡張する方法を説明します。また、ASDFの関数の挙動をカスタマイズするためのさまざまなフックについても解説します。


Footnotes

(22)

古いASDFでは、計画を作る関数はtraverseであり、実行すべきアクションのリストを返していました。しかし、ASDF 3でplanオブジェクトが導入され、make-planがこのオブジェクトを返す関数として代わりに使われるようになったため、traverseは廃止予定です。traverseは後方互換性とデバッグのためだけに残されており、近い将来には削除されるかもしれません。

(23)

アクション(action)という用語は、Kent Pitmanの論文 “The Description of Large Systems”(→ 参考文献)で使われていて、これはUnixのmakeに端を発するのではないかと我々は考えています。この用語がASDFハッカーたちに使われるようになったのはASDF 2からですが、それ以前も単に明示されてはいなかっただけで、概念としてはASDF 1の当初からありました。