xyzzy: Lispコードのファイルをロード


Lispコードのファイルの内容をLispオブジェクトの形でLisp環境に取り込みます。ロードするファイルのコードは、Lisp式のソースコードかバイトコンパイル済みコードである必要があります。

以下は、"各種ロード関係の関数の違い"についてです。

load
インタプリタでloadします。
load-library
*.lcがあればそれをロードします。*.lcがなければ*.lをロードします。
autoload
関数1つ単位で、呼ばれたときロードするようにできます。関数が呼ばれるまではロードされません。
require
あるライブラリをロードします。ただし、既にロード済みならロードしません。
modules
この変数を見ると今どのモジュールがロード済か分かります。既にロード済だともうロードしません。

次の例では、foo.lというファイルをロードする。

(load "foo.l")

ロードパスの追加

load-library等でライブラリをロードする対象パスを*load-path*にリストで設定することもできます。

;; ライブラリをロードするパスを追加する。
(setq *load-path*
(cons (merge-pathnames "bar" (user-homedir-pathname))
*load-path*))

この例は、ユーザのホームディレクトリにあるbarというサブディレクトリもライブラリをロードする際の検索対象となる。但し、追加されるパスのサブディレクトリについては、検索対象から除外される。
.xyzzyから.xyzzy.lをロードする。

.xyzzyに大量のLispコードを記述する場合には、.xyzzy.lという別の名前のファイルへ内容をコピーして、それをバイトコンパイルし、.xyzzyでは下記の様にloadでバイトコンパイル済みファイル(.xyzzy.lc)をロードする記述のみしておくと良い。

(load ".xyzzy.lc")

この例は、次の様に工夫すると何かと便利である。

(defvar *init-file-name* (merge-pathnames ".xyzzy.l" (user-homedir-pathname)))
;; コンパイル済みファイルがあれば、それを対象とする。
(if (file-exist-p (concat *init-file-name* "c"))
(setq *init-file-name* (concat *init-file-name* "c")))
;; Lispファイルのロード
(if (file-exist-p *init-file-name*)
(load *init-file-name*)
;; .xyzzy.lファイルが無い場合は、デフォルトの初期化ファイルを利用する。
;; 但し、user-homedir-pathname と si:system-root が異なる場合のみ。
(unless (equalp (user-homedir-pathname) (si:system-root))
(load (merge-pathnames ".xyzzy" (si:system-root)))))

この例は、.xyzzy.lc(コンパイル済みの.xyzzy.l)ファイルがあればそれをロードし、コンパイル済みで無ければ.xyzzy.lをロードするが、それも無ければ全てのユーザ共通の初期化ファイルを(マルチユーザ環境の場合のみ)ロードする。

次の例では、前記と同様の結果を得ることができる。

(unless (equalp (user-homedir-pathname) (si:system-root))
(setq *load-path*
(cons (merge-pathnames "site-lisp" (user-homedir-pathname))
*load-path*))
)

(if (file-exist-p (merge-pathnames ".xyzzy.*" (user-homedir-pathname)))
(require "../.xyzzy")
(unless (equalp (user-homedir-pathname) (si:system-root))
(load (merge-pathnames ".xyzzy" (si:system-root)))))

この例では、マルチユーザ環境であれば、*load-path* に ~/site-lispディレクトリを追加するので、当該ユーザの為のライブラリの管理にも便利である。

引用元: xyzzy備忘録: xyzzyLisp用例 -- らいおさむのお屋敷,
"http://www.osamurai.flnet.org/memo/xyzzy/tips#SEC.1.1"