Next: , Previous: , Up: ASDFのオブジェクトモデル   [Contents][Index]


7.1 オペレーション

ユーザーがシステムに対して何らかの処理を要求したときは、必ず適切なオペレーションオブジェクトが生成されます。例えば次のような処理が考えられるでしょう:

オペレーションは単に直接呼び出すこともできますし、実行せずにその結果がどうなるか確認することもできます。そこで実際の細々とした仕事をするのは、オペレーションとコンポーネント型によって特定化されたメソッド(のまとまり)です。オペレーションは、システムとともに引数としてoperateに与えることで、呼び出すことができます。(→ operate

頻出の作業についてはoperationの組み込みサブクラスがありますし、あまり使われない作業についても既にあることが多いでしょう。これに加えてASDFは、プログラマがASDF拡張を定義するためのビルドブロックとして使える「抽象的な」operationクラスも備えています。これについては以下に順を追って解説します。

オペレーションは、operateによってシステムに対して呼び出されます。

総称関数: operate operation component &rest initargs &key force force-not verbose &allow-other-keys
総称関数: oos operation component &rest initargs &key &allow-other-keys

operatecomponentに対してoperationを呼び出します。oos(operate-on-systemの略)はoperateのエイリアスです。

operationはオペレーション指示子(operation designator)です。オペレーション指示子はoperationオブジェクトそのものでもよいですが、通常はシンボルが使われるでしょう。シンボルはmake-operationに渡され、(そこでmake-instanceが呼ばれて)operationオブジェクトが作られます。 componentはコンポーネント指示子(component designator)です。コンポーネント指示子は同様に、componentオブジェクトそのものや、コンポーネント(たいていはシステム)の名前を表す文字列・シンボル(string-downcaseで小文字化される)ですが、システムの子コンポーネントを指したい場合は文字列・シンボルのリスト 24も使えます。

initargsmake-operationに渡される仕様は廃止予定であり、削除されるでしょう。詳しくはmake-operationを参照してください。依存関係によって、オペレーションがシステムやその子コンポーネントに対して他のオペレーションを呼び出すことがありますが、この際、元のinitargsが渡されるかどうかは(今のところ)不確定です。

force:allの場合、(依存関係に含まれる)すべてのシステムが、前回のコンパイルから未変更でも再コンパイルされます。forcetの場合、ロードされるシステムに限り、前回のコンパイルから未変更でも再コンパイルされます。forceが(システム指示子の)リストの場合、リストに含まれるシステムは前回のコンパイルから未変更でも再コンパイルされます。force-not:allの場合、(依存関係に含まれる)すべてのシステムは、前回のコンパイルから変更されていても再コンパイルされません。force-nottの場合、ロードされるシステム以外のシステムは、前回のコンパイルから変更されていても再コンパイルされません。(この仕様はASDF 3.1.2で変更されました。)forceが(システム指示子の)リストの場合、リストに含まれるシステムは前回のコンパイルから変更されていてもコンパイルされません。

forceforce-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)
関数: make-operation operation-class &rest initargs

initargsは、オペレーションオブジェクトを作る際にmake-instanceに渡されます。

注意: operationinitargsは廃止予定であり、近い将来ASDFから削除されるでしょう。

注意: operationのインスタンスは、直接make-instance作ってはいけません。必ずmake-operationを使ってください。operationインスタンスを直接作ろうとすると、ランタイムエラーを起こすでしょう。


Footnotes

(24)

[訳注] 降順。例えば(defsystem "foo" :components ((:module "src" ...)))srcモジュールはリスト("foo" "src")で指定できます。

(25)

[訳注] traverseはオペレーション指示子とコンポーネント指示子を引数に取り、実行されるアクション(オペレーションとコンポーネントの対)のリストを順序付きで返します。ただし、廃止予定