Next: , Previous: , Up: ASDFを使う   [Contents][Index]


5.2 便利な関数

システムに対するもっとも基本的なオペレーションについては、次の3つのコマンドが用意されています: load-systemcompile-systemtest-system

load-systemの変種としてrequire-systemがあり、後者はシステムが既にロードされている場合はロードを行いません。これは例えば、処理系のコアイメージに最初から含まれているライブラリの再ロードを避けるためなどに使えます。

これらに加えてmakeという関数もあり、これを呼んだときのオペレーションはシステム開発者が選択することができます。何も指定されていない場合はload-systemと同じオペレーション(load-op)を実行しますが、例えば、ドキュメントを出力するためのシステムを作った場合、makeで(ロードではなく)ドキュメントを出力するようにできます。

ASDFは拡張可能なシステムであり、コンポーネントに対する新しいオペレーションを定義することもできます。オペレーション一般を呼び出す総称関数としてoperateがあり、デフォルトのものだけでなく任意のオペレーションを扱うことができます。(operateのエイリアスとしてoosが定義されているので、REPL上ではこちらがよく使われます。oosはoperate-on-systemの略でmk-defsystem11から受け継いだ名前です。) コンパイル・ロード・テスト以外のオペレーションを行いたい場合にはoperateを使うと良いでしょう。

関数: load-system system &rest keys &key force force-not verbose version &allow-other-keys

load-opsystem、キーワード引数にoperateを適用します。システムを現在のイメージにロードしたい場合は、load-systemを呼び出すのがもっとも標準的で推奨されるやり方です。

関数: compile-system system &rest keys &key force force-not verbose version &allow-other-keys

compile-opsystem、キーワード引数にoperateを適用します。この関数はシステムのすべてのファイルをコンパイルしますが、必ずしもそれらを現在のイメージにロードするとは限りません(が、しないとも限りません)。実際のところ、ほとんどのシステムでは、すべてのオブジェクトファイルがロードされるということはないでしょう。この関数はload-systemとの対称性のために存在しますが、挙動をちゃんと理解した上でビルドスクリプトを書く、という場合以外は使わないほうがよいです。もっとも、そのようなケースではcompile-opよりもprogram-opのほうが適切なこともあるでしょう。

関数: test-system system &rest keys &key force force-not verbose version &allow-other-keys

test-opsystem、キーワード引数にoperateを適用します。test-opの解説を参照してください。

関数: make system &rest keys &key &allow-other-keys

ASDF 3.1から加わった関数であり、システムに対して何らかのオペレーションを実行します。デフォルトの動作はload-systemと同じですが、システム開発者はシステム定義の中で実行すべきオペレーションを指定することができます。具体的には、defsystemフォームの:build-operationにオペレーションを指定し、:build-pathnameに出力先のパス名を指定します。(→ ビルドオペレーション

この関数は実験的であり、テストが十分ではありませんので、自己責任で使ってください。

関数: require-system system &rest keys &key &allow-other-keys

require-systemcl:requireと類似の動作をします。つまり、既にロードされているシステムを(例えシステムが更新されていても)ロードしません。同じ動作はload-systemにロード済みシステムを除外するようにキーワード引数を指定しても可能です。12 現在メンテナンスされているフリーの処理系(ABCL、Clozure CL、CMUCL、ECL、GNU CLISP、MKCL、SBCLの最近のバージョン)では、いったんASDFがロードされると、cl:requireでもASDFシステムをロードできるようになりますが、その動作は、cl:requireが処理系の知らないモジュール名を受け取ったときはrequire-systemに渡す、という仕組みになります。(逆にrequire-systemcl:requireを呼び出すことはありません。潜在的に無限ループを生んでしまう可能性があるからです。)

cl:requirerequire-systemは、現在のセッションでは修正されていないコードをロードするのに向いています。この2つの違いを説明すると、cl:requireは処理系の提供する拡張モジュールをロードするのに使われますが、require-systemは普通はその用途では使えません。(ただし、SBCLやMKCLのように、処理系の拡張モジュールがそもそもシステムとして定義されている場合はrequire-systemでもロードできます。)また、あなたが開発もデバッグもしていないシステムで、インストール済みのバージョンを使えば問題ないと考えられる場合にもrequire-system(あるいは、上に挙げた処理系ではcl:require)でロードするとよいかもしれません。

しかし、あなたが開発、デバッグしていたり、あるいは何にせよ変更を行ったシステムに対してはload-systemを使うべきです。load-systemは変更されたファイルとその依存関係に基づいて適切に再ビルドを行います。(指定されたシステムとそれが依存しているシステムです、それ以外のビルドは行いません。)13

関数: already-loaded-systems

これまでにロードされたシステムの名前のリストを返します。


Footnotes

(11)

[訳注] ASDF以前に使われていたシステム定義ツール。

(12)

:force-not (already-loaded-systems)を指定すると実現できます。

(13)

[訳注] 例を挙げて説明すると、システムlibraryとシステムapplicationがあってapplicationlibraryに依存しているとき、libraryのコードを変更して(asdf:load-system :application)を実行すると、libraryapplicationの順で必要な再コンパイル、ロードが行われます。