Next: コンポーネント, Previous: ASDFのオブジェクトモデル, Up: ASDFのオブジェクトモデル [Contents][Index]
ユーザーがシステムに対して何らかの処理を要求したときは、必ず適切なオペレーションオブジェクトが生成されます。例えば次のような処理が考えられるでしょう:
オペレーションは単に直接呼び出すこともできますし、実行せずにその結果がどうなるか確認することもできます。そこで実際の細々とした仕事をするのは、オペレーションとコンポーネント型によって特定化されたメソッド(のまとまり)です。オペレーションは、システムとともに引数としてoperateに与えることで、呼び出すことができます。(→ operate)
頻出の作業についてはoperationの組み込みサブクラスがありますし、あまり使われない作業についても既にあることが多いでしょう。これに加えてASDFは、プログラマがASDF拡張を定義するためのビルドブロックとして使える「抽象的な」operationクラスも備えています。これについては以下に順を追って解説します。
| • 組み込みのオペレーション | ||
| • 新しいオペレーションを定義する | ||
オペレーションは、operateによってシステムに対して呼び出されます。
operateはcomponentに対してoperationを呼び出します。oos(operate-on-systemの略)はoperateのエイリアスです。
operationはオペレーション指示子(operation designator)です。オペレーション指示子はoperationオブジェクトそのものでもよいですが、通常はシンボルが使われるでしょう。シンボルはmake-operationに渡され、(そこでmake-instanceが呼ばれて)operationオブジェクトが作られます。
componentはコンポーネント指示子(component designator)です。コンポーネント指示子は同様に、componentオブジェクトそのものや、コンポーネント(たいていはシステム)の名前を表す文字列・シンボル(string-downcaseで小文字化される)ですが、システムの子コンポーネントを指したい場合は文字列・シンボルのリスト 24も使えます。
initargsがmake-operationに渡される仕様は廃止予定であり、削除されるでしょう。詳しくはmake-operationを参照してください。依存関係によって、オペレーションがシステムやその子コンポーネントに対して他のオペレーションを呼び出すことがありますが、この際、元のinitargsが渡されるかどうかは(今のところ)不確定です。
forceが:allの場合、(依存関係に含まれる)すべてのシステムが、前回のコンパイルから未変更でも再コンパイルされます。forceがtの場合、ロードされるシステムに限り、前回のコンパイルから未変更でも再コンパイルされます。forceが(システム指示子の)リストの場合、リストに含まれるシステムは前回のコンパイルから未変更でも再コンパイルされます。force-notが:allの場合、(依存関係に含まれる)すべてのシステムは、前回のコンパイルから変更されていても再コンパイルされません。force-notがtの場合、ロードされるシステム以外のシステムは、前回のコンパイルから変更されていても再コンパイルされません。(この仕様はASDF 3.1.2で変更されました。)forceが(システム指示子の)リストの場合、リストに含まれるシステムは前回のコンパイルから変更されていてもコンパイルされません。
forceとforce-notに影響されるのは、依存関係に含まれていて、既にコンパイルされているシステムです。force-notは当然forceに優先する(べきな)のですが、この挙動は残念ながらASDF 3.1.2以降で初めて保証されました。また、関数register-immutable-system(ASDF 3.1.5以降)によってイミュータブルと登録されたシステムは、(たとえ.asdファイルがファイルシステムによって更新されていなくても)常にforce-notであるとみなされます。(→ Miscellaneous Functions)
次のフォームを実行すると、operateが実際に何をどのような順序で実行するのか確かめることができます。25
(asdf:traverse operation-class system-name)
initargsは、オペレーションオブジェクトを作る際にmake-instanceに渡されます。
注意: operationのinitargsは廃止予定であり、近い将来ASDFから削除されるでしょう。
注意: operationのインスタンスは、直接make-instanceで作ってはいけません。必ずmake-operationを使ってください。operationインスタンスを直接作ろうとすると、ランタイムエラーを起こすでしょう。