モジュールに関する一般的な説明
- 以下の説明は Guileのマニュアル[6.18.1 General Information about Modules] を要約したものです.
モジュールの所在
グローバル変数 %load-path
▹ Guileは,あらゆるモジュール(ソースコード)を,%load-path に登録されたディレクトリを検索してロードします. このグローバル変数の値はディレクトリのリストです. 例えば,筆者の環境では次のようなリストになっています.$ guile GNU Guile 3.0.5 ...... 起動メッセージ ...... guile> %load-path $1 = ("/usr/share/guile/3.0" "/usr/share/guile/site/3.0" "/usr/share/guile/site" "/usr/share/guile") guile>%load-path の値は,
(list (%library-dir) (%site-dir) (%global-site-dir) (%package-data-dir))
という式によって初期設定されます.この式を試しに実行してみると,
その結果は上記の %load-path の値と一致します.
ちなみに,筆者の環境では,%load-path に登録されているディレクトリのうち,
先頭の /usr/share/guile/3.0 だけが存在し,他のディレクトリは存在しません.
他のディレクトリは,必要に応じて自前で作成するのだと思います.
▹
モジュール(ソースコード)を新たに作成して,
どこかのディレクトリに格納したときには,
そのディレクトリを %load-path に登録しなければなりません.
その登録方法は,モジュールを定義する方法と一緒に説明します.
グローバル変数 %load-compiled-path
▹ Guileは,モジュールのソースコードをVMコードにコンパイルします. そのVMコードは, グローバル変数 %load-compiled-path に登録されたディレクトリにキャッシュされ,再利用されます.このグローバル変数の値はディレクトリのリストです. 例えば,筆者の環境では次のようなリストになっています.$ guile GNU Guile 3.0.5 ...... 起動メッセージ ...... guile> %load-compiled-path $1 = ("/usr/lib/x86_64-linux-gnu/guile/3.0/ccache" "/usr/lib/x86_64-linux-gnu/guile/3.0/site-ccache") guile>%load-compiled-path の初期値は,
- Guileが利用するキャシュ用ディレクトリと,
- サイト固有のキャッシュ用ディレクトリ
モジュールのロード
▹ Guileは,モジュールをおおよそ次の手順に沿ってロードします.- モジュール名(下記参照)が示すモジュールのソースコードのファイルと,キャッシュされているVMコードのファイルを探します.
- キャッシュされているVMコードがソースコードより古くなければ, そのVMコードをロードします.
- VMコードがキャシュされていない(存在しない)か, または,ソースコードより古いときには, ソースコードをコンパイルして, コンパイル後のVMコードをキャッシュして, そのVMコードをロードします.
モジュール名とモジュールファイル
モジュール名とは
▹ モジュール名は,
(ice-9 textual-ports) や (ice-9 regex) や (srfi srfi-11)
などのように,シンボルのリストです.
ただし,各シンボルにクォート(')は付けません.
これらのモジュール名は,モジュールファイルの相対パスを示しています.
相対パスの起点は
%load-path
や
%load-compiled-path
に登録されているディレクトリです.
例えば,
(ice-9 textual-ports)
というモジュール名は
ice-9/textual-ports.scm (ソースコード)
ice-9/textual-ports.go (VMコード)
というファイル(の相対パス)を示しています.
ソースコードファイルの起点は
%loda-path
に登録されているディレクトリで,
VMコードファイルの起点は
%load-compiled-path
に登録されているディレクトリです.
ただし,
".scm" はソースコードファイルの標準の拡張子で,
".go" はVMコードファイルの標準の拡張子です.
これらは自動的に付加されます.
ice-9/textual-ports.go (VMコード)
モジュール名の一般的な形式
▹ 一般に,Guileのモジュール名は,次のような形式のリストです.
(subdir$_1$ ... subdir$_n$ filename)
ここで:
- subdir$_i$ は %load-path や %load-compiled-path に登録されているディレクトリを起点とするサブディレクトリの名前です.
- filename は, モジュール(のコード)を格納したファイルの名前です. ただし,拡張子は含みません.
-
このモジュール名は
subdir$_1$/ ... /subdir$_n$/filename.scm (ソースコード)といったファイルの相対パスを示しています.相対パスの起点は %load-path や %loda-compiled-path に登録されているディレクトリです.
subdir$_1$/ ... /subdir$_n$/filename.go (VMコード)
モジュールファイルの拡張子
▹ Guileは,モジュールのソースコードのファイルを検索するとき, モジュール名が表現する相対パスに, %load-extensions に登録された拡張子を付けて検索します. %load-extensions は,ソースコードファイルの拡張子のリストを値とするグローバル変数です. 例えば,筆者の環境では以下に示すようなリストです.$ guile GNU Guile 3.0.5 guile> %load-extensions $1 = (".scm" "") guile>このグローバル変数に新たな拡張子(例えば,".mod"など)を登録すれば, その拡張子でも検索を行うのだと思います. ソースコードファイルの拡張子は設定可能になっていますが, VMコードファイルの拡張子は .go で固定されています.