Next: ASDFがシステムを探す場所を設定する, Previous: defsystemでシステムを定義する, Up: Top [Contents][Index]
ASDFは、全体がオブジェクト指向でデザインされています。システムの構造も、システムに対するオペレーションも、拡張可能なプロトコルに従っているので、プログラマはASDFに新しい機能を加えることができます。例えば、cffi
はcffi-grovel
というASDF拡張によって、Cライブラリへのインターフェースの記述ファイルや、LispにCコードを埋め込むラッパーファイルを扱うコンポーネント型(それぞれcffi-grovel-file
とcffi-wrapper-file
)を追加し、ABCL提供のasdf-jar
はJavaのJARアーカイブを作る機能をもたらし、poiu
はバックグラウンドプロセスを使って並列ビルドを可能にします。
ASDFの最も基本的なクラスはcomponent
とoperation
です。component
が表すのは、1つのソースファイルか、複数のソースファイルのまとまりか、あるいはそれらから生み出されるもの(faslファイルなど)です。operation
はコンポーネントに対して行われる何らかの変換であり、コンポーネントを中間結果や最終的な生成物に変えます。コンポーネント同士は依存関係によって関係づけられていて、それはシステム定義の中で指定されます。
operate
によってコンポーネント(たいていはシステム)に対するオペレーションを指示したとき、ASDFはまずmake-plan
関数を使って、依存関係を調べ、処理全体の計画(plan)を建てます。22
make-plan
の返すplan
オブジェクトは実行すべきアクション(action)の順序付きリストを含んでいます。アクションとはoperation
とcomponent
のペアであり、ビルドの1ステップとしてperform
されるものです。また、このアクションのリストは、どのアクションも必要な依存関係が満たされるまでは実行されないことを保証します。23
この章では我々は、ASDFのオブジェクト指向プロトコル――プロトコルを構成するクラスと、それに対する総称関数――について解説します。これらの総称関数は多くの場合、コンポーネントとオペレーションの両方を引数に取ります。CLOSの多重ディスパッチを利用することで、ASDFは強力な機能を持ち、設定が柔軟に変更できるようになっています。我々は、まず組み込みのコンポーネントとオペレーションについて解説し、さらに新しいクラスやメソッドを定義してASDFプロトコルを拡張する方法を説明します。また、ASDFの関数の挙動をカスタマイズするためのさまざまなフックについても解説します。
• オペレーション | ||
• コンポーネント | ||
• 依存関係について | ||
• 関連する関数 |
古いASDFでは、計画を作る関数はtraverse
であり、実行すべきアクションのリストを返していました。しかし、ASDF 3でplan
オブジェクトが導入され、make-plan
がこのオブジェクトを返す関数として代わりに使われるようになったため、traverse
は廃止予定です。traverse
は後方互換性とデバッグのためだけに残されており、近い将来には削除されるかもしれません。
アクション(action)という用語は、Kent Pitmanの論文 “The Description of Large Systems”(→ 参考文献)で使われていて、これはUnixのmake
に端を発するのではないかと我々は考えています。この用語がASDFハッカーたちに使われるようになったのはASDF 2からですが、それ以前も単に明示されてはいなかっただけで、概念としてはASDF 1の当初からありました。