Next: 関連する関数, Previous: コンポーネント, Up: ASDFのオブジェクトモデル [Contents][Index]
ビルドを成功させるためには、アクションのグラフが循環的であってはなりません。あなたが(ASDFの純粋なユーザーであれ、拡張を実装しているのであれ)依存関係のグラフにループを含めてしまうと、ASDFは盛大なエラーを引き起こすでしょう。依存の向きを明確にするため、ASDF 3では、アクションが他のアクションに依存していることをrequiring、requiredという言葉で表しています。つまり“requiring action”は、それ自身がperform
される前に、そのすべての“required action”が完了することに依存(depends-on
)しているわけです。
defsystem
の文法を使うと、ユーザーはオブジェクトの階層グラフに沿った直接の依存関係(コンポーネントとその親コンポーネント、子コンポーネント、兄弟コンポーネント31)を簡単に書くことができますし、CLOSメソッドをカスタマイズすることでさらに複雑な依存関係を表現することも可能です。もっとも一般的なオペレーションであるload-op
、compile-op
、load-source-op
などはコンポーネントの階層を「下向き」に伝搬し、「共変的」に振る舞います。つまり、親コンポーネントに対するオペレーションを行う前に、まずはすべての子コンポーネントに対して同じオペレーションを行わなくてはならないわけです。いっぽう、prepare-op
や(ASDF 3で導入された)prepare-souce-op
のようなオペレーションは、コンポーネントの階層を「上向き」に伝搬し、「反変的」に振る舞います。つまり、子コンポーネントに対するコンパイルを準備するオペレーションを行う前に、まずは親コンポーネントに対して同じオペレーションを行わなくてはならず、そのような挙動によって、子コンポーネントがコンパイル・ロードされる前に、親コンポーネントの依存関係がすべて(コンパイル、)ロードされることが保証されるわけです。最後に、test-op
やload-bundle-op
はターゲットのシステムのレベルにとどまるオペレーションであり、階層を伝搬していくことはありません。これらはシステムに対してグローバルな処理を行うのです。
[訳者補足]
このセクションはオペレーションの依存関係について述べたものですが、実践的には、新しいオペレーションを定義するの補足に挙げた5つのオペレーションについて理解していれば事足りるでしょう。つまり、
load-op
、compile-op
、load-source-op
はdownward-operation
(かつselfward-operation
)であり、
prepare-op
、prepare-source-op
はupward-operation
(かつsideway-operation
)であり、
test-op
、load-bundle-op
はselfward-operation
です。
[訳者補足終わり]