Next: この先へ進む, Previous: システムをロードする, Up: ASDFを使う [Contents][Index]
システムに対するもっとも基本的なオペレーションについては、次の3つのコマンドが用意されています: load-system
、compile-system
、test-system
load-system
の変種としてrequire-system
があり、後者はシステムが既にロードされている場合はロードを行いません。これは例えば、処理系のコアイメージに最初から含まれているライブラリの再ロードを避けるためなどに使えます。
これらに加えてmake
という関数もあり、これを呼んだときのオペレーションはシステム開発者が選択することができます。何も指定されていない場合はload-system
と同じオペレーション(load-op
)を実行しますが、例えば、ドキュメントを出力するためのシステムを作った場合、make
で(ロードではなく)ドキュメントを出力するようにできます。
ASDFは拡張可能なシステムであり、コンポーネントに対する新しいオペレーションを定義することもできます。オペレーション一般を呼び出す総称関数としてoperate
があり、デフォルトのものだけでなく任意のオペレーションを扱うことができます。(operate
のエイリアスとしてoos
が定義されているので、REPL上ではこちらがよく使われます。oos
はoperate-on-systemの略でmk-defsystem
11から受け継いだ名前です。) コンパイル・ロード・テスト以外のオペレーションを行いたい場合にはoperate
を使うと良いでしょう。
load-op
、system、キーワード引数にoperate
を適用します。システムを現在のイメージにロードしたい場合は、load-system
を呼び出すのがもっとも標準的で推奨されるやり方です。
compile-op
、system、キーワード引数にoperate
を適用します。この関数はシステムのすべてのファイルをコンパイルしますが、必ずしもそれらを現在のイメージにロードするとは限りません(が、しないとも限りません)。実際のところ、ほとんどのシステムでは、すべてのオブジェクトファイルがロードされるということはないでしょう。この関数はload-system
との対称性のために存在しますが、挙動をちゃんと理解した上でビルドスクリプトを書く、という場合以外は使わないほうがよいです。もっとも、そのようなケースではcompile-op
よりもprogram-op
のほうが適切なこともあるでしょう。
test-op
、system、キーワード引数にoperate
を適用します。test-opの解説を参照してください。
ASDF 3.1から加わった関数であり、システムに対して何らかのオペレーションを実行します。デフォルトの動作はload-system
と同じですが、システム開発者はシステム定義の中で実行すべきオペレーションを指定することができます。具体的には、defsystem
フォームの:build-operation
にオペレーションを指定し、:build-pathname
に出力先のパス名を指定します。(→ ビルドオペレーション)
この関数は実験的であり、テストが十分ではありませんので、自己責任で使ってください。
require-system
はcl:require
と類似の動作をします。つまり、既にロードされているシステムを(例えシステムが更新されていても)ロードしません。同じ動作はload-system
にロード済みシステムを除外するようにキーワード引数を指定しても可能です。12 現在メンテナンスされているフリーの処理系(ABCL、Clozure CL、CMUCL、ECL、GNU CLISP、MKCL、SBCLの最近のバージョン)では、いったんASDFがロードされると、cl:require
でもASDFシステムをロードできるようになりますが、その動作は、cl:require
が処理系の知らないモジュール名を受け取ったときはrequire-system
に渡す、という仕組みになります。(逆にrequire-system
がcl:require
を呼び出すことはありません。潜在的に無限ループを生んでしまう可能性があるからです。)
cl:require
やrequire-system
は、現在のセッションでは修正されていないコードをロードするのに向いています。この2つの違いを説明すると、cl:require
は処理系の提供する拡張モジュールをロードするのに使われますが、require-system
は普通はその用途では使えません。(ただし、SBCLやMKCLのように、処理系の拡張モジュールがそもそもシステムとして定義されている場合はrequire-system
でもロードできます。)また、あなたが開発もデバッグもしていないシステムで、インストール済みのバージョンを使えば問題ないと考えられる場合にもrequire-system
(あるいは、上に挙げた処理系ではcl:require
)でロードするとよいかもしれません。
しかし、あなたが開発、デバッグしていたり、あるいは何にせよ変更を行ったシステムに対してはload-system
を使うべきです。load-system
は変更されたファイルとその依存関係に基づいて適切に再ビルドを行います。(指定されたシステムとそれが依存しているシステムです、それ以外のビルドは行いません。)13
これまでにロードされたシステムの名前のリストを返します。