Next: , Previous: Repeated Loading, Up: Loading


14.6 機能

providerequireは、 ファイルを自動的にロードするためのautoloadの代替手段です。 それらは指定した機能(features)という考え方で動作します。 自動ロードは特定の関数を呼び出すことで起動しますが、 機能はその名前でプログラムが最初に要求したときにロードします。

機能名は、関数や変数などの集合を表すシンボルです。 それらを定義するファイルでは、その機能を提供(provide)します。 それらを使う別のプログラムでは、 その機能を要求(require)することで、 それらが定義されることを確実にします。 こうすると、未ロードであれば定義しているファイルをロードします。

機能を要求するには、機能名を引数にしてrequireを呼び出します。 requireは、グローバル変数featuresを調べて、 目的の機能がすでに提供されているかどうか調べます。 提供されていなければ、適当なファイルから機能をロードします。 このファイルでは、トップレベルでprovideを呼び出して、 featuresに機能を追加するべきです。 そうしないと、requireはエラーを通知します。 たとえば、emacs/lisp/prolog.el には、 つぎのコードのようなrun-prologの定義が入っています。

     (defun run-prolog ()
       "Run an inferior Prolog process, with I/O via buffer *prolog*."
       (interactive)
       (require 'comint)
       (switch-to-buffer (make-comint "prolog" prolog-program-name))
       (inferior-prolog-mode))

(require 'comint)は、ファイルcomint.elが未ロードであると、 そのファイルをロードします。 これにより、make-comintが定義済みであることを保証します。 普通、機能には、その機能を提供するファイル名からとった名前を付けますから、 requireにファイル名を指定する必要はありません。

comint.elファイルには、つぎのトップレベルの式が入っています。

     (provide 'comint)

これにより、グローバル変数featuresのリストに comintが追加されるので、 これ以降に(require 'comint)を実行しても、 なにもしないでよいことになります。

ファイルのトップレベルでrequireを使うと、 そのファイルをロードする場合と同様に、 そのファイルをバイトコンパイルするとき(see Byte Compilation)にも requireには効果があります。 要求したパッケージに、 バイトコンパイラが知っている必要があるマクロが入っている場合です。

トップレベルのrequireの呼び出しは、 バイトコンパイル中に評価されますが、 provideの呼び出しは評価しません。 したがって、つぎの例のように、 同じ機能に対するprovideに続けてrequireを書くことで、 バイトコンパイルするまえに定義のファイルをロードすることを確実にできます。

     
     
     
     (provide 'my-feature)  ; バイトコンパイラは無視し、
                            ;   loadは評価する
     (require 'my-feature)  ; バイトコンパイラは評価する

コンパイラはprovideを無視し、 続くrequireの処理では当該ファイルをロードします。 ファイルのロード時にはprovideの呼び出しを実行するので、 そのあとのrequireの呼び出しは、 ファイルをロードするときにはなにもしません。

— Function: provide feature

この関数は、機能featureをロードし終えたこと、あるいは、 ロード中であることを現在のEmacsセッション内で宣言する。 つまり、featureに関連した機能が他のLispプログラムから利用できることを 意味する。

provideの呼び出しの直接の効果は、 featureがリストfeaturesに入っていなければ、 featureをリストfeaturesの先頭に入れることである。 引数featureはシンボルであること。 providefeatureを返す。

          features
                (bar bish)
          
          (provide 'foo)
                foo
          features
                (foo bar bish)

自動ロードによってファイルをロードしているとき、 その内容を評価することでエラーになってロードを中止すると、 ロード中に行われた関数定義やprovideの呼び出しはもとに戻す。 see Autoload

— Function: require feature &optional filename

この関数は((featurep feature)を使って) 現在のEmacsセッション内にfeatureが存在するかどうか調べる。 引数featureはシンボルであること。

機能が存在していなければ、requireは、 loadを使ってfilenameをロードする。 filenameを指定しないと、シンボルfeatureの名前を ロードすべきファイル名の基にする。 しかしながら、この場合には、requireは、 接尾辞を必ず付加してfeatureを探す。 featureだけの名前のファイルは探さない。

featureを提供するファイルのロードに失敗すると、 requireはエラー ‘Required feature feature was not provided’を通知する。

— Function: featurep feature

この関数は、現在のEmacsセッションでfeatureが提供されていれば (つまり、featurefeaturesのメンバであれば) tを返す。

— Variable: features

この変数の値は、 現在のEmacsセッションにロード済みの機能を表すシンボルのリストである。 各シンボルは、provideを呼び出すことでこのリストに追加される。 リストfeatures内の要素の順番は関係ない。