% Function PROVIDE, REQUIRE
Function PROVIDE
, REQUIRE
provide
module-name => implementation-dependent
require
module-name &optional
pathname-list => implementation-dependent
module-name - 文字列指定子
pathname-list - nil
か、
パス名指定子の空ではないリスト。
デフォルトはnil
。
provide
は*modules*
が保有しているリストに、
そのような名前がまだ存在していないときに
module-nameをそのリストに追加します。
require
は*modules*
が保有するリスト内に
module-nameが現れているかテストします。
もし現れているとき、require
は即座に返却します。
それ以外のとき、
次に示すようにファイルの集合を適切にロードするよう試みます。
pathname-listの引数について、
nil
ではなくパス名のリストを指定しているとき、
左から右の順番でロードを行います。
もしpathname-listがnil
のとき、
実装依存の仕組みにより
module-nameという名前のモジュールを
ロードするような仕組みが起動されます。
もしそのようなモジュールがロードできなかったとき、
型error
のエラーが通知されます。
両関数は、module-nameの存在をテストするときに
string=
を使用します。
;;; これは移植不可能なREQUIREの使い方を示しています。
;;; なぜなら実装依存のファイルロードメカニズムだからです。
(require "CALCULUS")
;;; これはリテラルな物理パス名のため
;;; 移植不可能なREQUIREの使い方です。
(require "CALCULUS" "/usr/lib/lisp/calculus")
;;; 移植可能な使い方のフォームとして論理パス名を指定しており、
;;; どこかで適用可能な変換が定義されているものとします。
(require "CALCULUS" "lib:calculus")
;;; 他の移植可能な使い方のフォームとして変数か
;;; テーブルの検索関数によるパス名の決定が挙げられます。
;;; これもまたどこかで初期化する必要があります。
(require "CALCULUS" *calculus-module-pathname*)
require
によって取られる特定の行動は、
provide
の呼び出しによって
(または一般的に*modules*
の値の変更によって)
影響します。
module-nameが文字列指定子ではなかったとき、
型type-error
のエラーが通知されるべきです。
もしrequire
が
ファイルシステムとの相互処理をしている間に
要求された処理に問題が生じて失敗したとき、
型file-error
のエラーが通知されます。
もしpathname-listの何かのパス名が
ワイルドカードのパス名を指定した指定子であったとき、
型file-error
のエラーが通知されるかもしれません。
*modules*
,
19.1.2. ファイル名としてのパス名
もしモジュールがひとつのパッケージに含まれているとき、 慣習的にはパッケージとモジュールの名前は同じになります。