次: , 前: Autoload, 上: Loading


14.5 ロードの繰り返し

1つのEmacsセッションにおいて、あるファイルを複数回ロードできます。 たとえば、バッファ内の関数定義を編集して、 関数定義を書き直してインストールし直したあとで、 もとの版に戻したいこともあるでしょう。 これには、もとのファイルを再ロードすればよいのです。

ファイルをロードしたり再ロードするとき、 関数loadload-libraryは、 コンパイルしていないファイルではなく、 バイトコンパイル済みのファイルを自動的にロードすることに注意してください。 ファイルを書き直して保存してから再インストールする場合、 新しい版をバイトコンパイルする必要があります。 さもないと、Emacsは、新しいコンパイルしていないファイルではなく、 バイトコンパイル済みの古いファイルをロードしてしまいます。 そのような場合、ファイルをロードすると、 `(compiled; note, source is newer)'とメッセージを表示して、 再コンパイルするように忠告してきます。

Lispライブラリファイルにフォームを書くときには、 ファイルを複数回ロードする可能性があることを忘れないでください。 たとえば、ライブラリを再ロードするたびに 各変数を再初期化すべきかどうか考えましょう。 defvarは、初期化済みの変数の値を変更しません。 (see Defining Variables。)

連想リストに要素を追加するもっとも簡単な方法はつぎのとおりです。

     (setq minor-mode-alist
           (cons '(leif-mode " Leif") minor-mode-alist))

しかし、これでは、ライブラリを再ロードすると、 複数の要素を追加してしまいます。 これを避けるにはつぎのようにします。

     (or (assq 'leif-mode minor-mode-alist)
         (setq minor-mode-alist
               (cons '(leif-mode " Leif") minor-mode-alist)))

リストに要素を1回だけ追加するには、 add-to-list(see Setting Variables)も使えます。

ライブラリをすでにロードしたかどうか明示的に調べたいこともあるでしょう。 ライブラリ内で以前ロードされたかどうか検査する方法の1つは、 つぎのとおりです。

     (defvar foo-was-loaded nil)
     
     (unless foo-was-loaded
       execute-first-time-only
       (setq foo-was-loaded t))

ライブラリで名前付き機能を提供するためにprovideを使っていれば、 ファイルの始めのほうでfeaturepを使って、 provideを以前呼び出したかどうか検査できます。