15. ライブラリ(Libraries)

ライブラリの記述は次のような部分からなる。
単一のライブラリ宣言式。
これはライブラリの名前、他のライブラリによる使用のためそのライブラリから エクスポートされるモジュール集合、および定義中のライブラリによる使用のため他の ライブラリからインポートされるモジュール集合を指定する。ライブラリ宣言式は以下で解説する。

ソースコードとライブラリの対応。
この対応の付け方は処理系定義のものとする。

実行可能コードとライブラリの対応。
この対応の付け方は処理系定義のものとする。コンパイラを呼び出して実行可能コードを 生成する仕方は処理系定義のものとする。

ライブラリとライブラリエクスポート情報の対応。
この対応の付け方は処理系定義のものとする。コンパイラを呼び出して ライブラリエクスポート情報を作成する仕方は処理系定義のものとする。 ライブラリエクスポート情報の内容は処理系依存であるが、 そのライブラリをインポートする他のライブラリのソースコードを処理するために 必要な情報をまとめたものである。

ライブラリエクスポート情報は、他のライブラリにインポートすることを許す必要のある、 Dylanライブラリ中の唯一の部分である。どれかのモジュールをエクスポートするライブラリは、 そのモジュールをインポートするライブラリを処理する際にコンパイラに情報を提供するために、 宣言をこれ以上つけ加える必要はない。むしろ、必要なそのような情報は エクスポートライブラリを処理する際に処理系依存の仕方で得られ、 エクスポートするライブラリのライブラリエクスポート情報に保持される。

ライブラリ宣言の構文はモジュール定義の構文と次の点を除いて正確に一致する。 当然ながら、moduleという言葉はlibraryという言葉に置き換わる。 さらに、ライブラリ宣言には作成節がない。

ライブラリからモジュールをエクスポートするとそのモジュールからエクスポートされている すべての変数が、他のライブラリのモジュールによりインポートできるようになる。 ライブラリからモジュールをエクスポートするには2つの方法があり得る。

  1. もしそのモジュールがそのライブラリで定義されているなら、ライブラリ宣言に library-export-clauseを含めてモジュールを指名することでエクスポートできる。 library-export-clause内の各module-nameはそのライブラリにより エクスポートされるモジュールの名前である。

  2. モジュールが他のライブラリからインポートされるなら、モジュールをインポートした library-use-optionにモジュールを(名前により、または暗黙的にexport: all により) 指定するexport-optionを含めることでエクスポートされる。

モジュールをライブラリにインポートすると、そのライブラリ内で定義されたモジュールは そのモジュールを使うことができるようになる。モジュールをライブラリにインポートしても、 ライブラリ内の表現はそのモジュールに付随するようにはならない。ライブラリ宣言中に、 被使用ライブラリからインポートされるモジュール集合にそのモジュールを含むような library-use-clauseを入れるとそのモジュールはそのライブラリにインポートされる。 デフォルトでは被使用ライブラリからエクスポートされているすべてのモジュールが、 被使用ライブラリにおけるのと同じ名前で、定義中のライブラリにインポートされる。

同じライブラリを使用する複数の使用節がある場合、インポートされるモジュールの集合は すべてのuse-clausesで指定されるものの和集合である。2つ以上の名前で インポートされるモジュールがあってもよい。

use-clause内のオプションはあるモジュールをインポートさせないようにするため、 インポートされるモジュールの一部またはすべてが新しい ライブラリで異なる名前を持つようにするため、あるいは被使用モジュールからインポートされた モジュールをエクスポートし直すため、に使用される。 これらのオプションのどれも特定のuse-clauseのスコープ内で適用され、 他のuse-clauseの動作には影響を与えない。

library-use-clauseの種々のオプションの意味は対応するmodule-use-clauseの オプションと、指定されているのがモジュール内の変数名ではなくライブラリ内のモジュール名で ある点を除いて、同様である。

library-use-clause内のlibrary-nameと対応するライブラリ記述との 対応付けの機構は処理系定義のものとする。

どの処理系も dylan という名のモジュールをエクスポートする、 dylan と いう名のライブラリを提供しなければならない。そのモジュールは Dylan言語の一部であると ドキュメントされた変数すべてを、またちょうどそれだけをエクスポートしなければならない。 さらに、これらの変数の値はDylan言語により指定されていなければならない。 dylanライブラリはこの他に処理系依存のライブラリをエクスポートしてもよい。

ライブラリ宣言は表現である。他の定義式と同様、ライブラリ宣言もトップレベルまたは beginの中でしか許されない。ライブラリ宣言内の名前はモジュール変数名ではない、 したがってモジュールに付随するライブラリ宣言に影響されない。ライブラリ宣言は define libraryが通常の意味を持つような任意のモジュールに付随することができる。

マクロがライブラリ宣言に展開されてもよい。これはライブラリ宣言のコンパイル中に起こる。

どのライブラリもdylan-userという名の暗黙的に定義されたモジュールを含む。 このモジュール内では、Dylan言語で定められたすべての変数に指定された名前を用いて アクセスできる。これら以外の処理系依存の変数で、このモジュールからアクセスできるものが あってもよい。


目次 索引