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
インスタンスを直接作ろうとすると、ランタイムエラーを起こすでしょう。