Gaucheのライブラリはモジュール毎に整理されています。Gaucheはどんな形式でも、 有効なScheme式が書かれてさえいればロードすることができますが、 Gaucheのライブラリは一定の形式を保って書かれています。 Gauche用にまとまったSchemeコードを書いたら、それをモジュール形式にしておくと 再利用がしやすくなるでしょう。
通常ひとつのファイルで ひとつのモジュールを定義しますが、モジュールを複数のファイルに分けることもできます。 まずひとつのファイルでモジュールを定義する方法を説明します。 Gaucheのライブラリで使われているテンプレートは次のような形式です。
;; モジュールのインタフェースの定義 (define-module foo (use xxx) (use yyy) (export foo1 foo2 foo3) ) ;; モジュール本体 (select-module foo) ... module body ...
このファイルは“foo.scm”という名で、*load-path*
にあるディレクトリの
いずれかに置かれなければなりません。
まず、define-module
フォームがモジュールfoo
を作成します。
define-module
フォーム内で、このモジュールが依存している他のモジュール
を ‘use
’ マクロを使ってロードし、このモジュールがエクスポートするシンボルを
‘export
’ 構文を使って指定します。(これらの構文の詳細はモジュールの定義と選択を
参照して下さい)。
これらのuse
フォームやexport
フォームは必ずしもdefine-module
フォームの先頭に置く必要はありませんが、このようにファイルの最初の方に固めておくことで、
foo
が依存しているモジュール群やfoo
が提供するシンボル等が
一覧しやすくなります。
次の、‘select-module
’ フォームにより、それ以降のScheme式が
モジュールfoo
の中で評価されます。モジュールの内容を全てdefine-module
の中に
書いてしまうことも出来ますが、最後の括弧を閉じ忘れやすいことや、エディタのインデントが
狂うことなどから、あまりお薦めしません。
select-module
フォームの後には、モジュールの内容であるScheme式を自由に書けます。
それらはモジュールfoo
の中で評価されます。モジュール内で定義するトップレベルの
束縛のうち、明示的に‘export’で指定されたシンボルのみが、このモジュールをインポートする他の
モジュールから見えます。
これで、他のプログラムは ‘(use foo)
’ とするだけでこのモジュールの機能が
利用可能になります。もしモジュールをサイト全体で利用できるようにしたければ、gosh
内で
(gauche-site-library-directory)
を評価して得られるディレクトリにfoo.scm
を置いて下さい。
モジュールの名前空間のトップに新たなモジュールを追加するのに気が引ける場合は、
モジュールを階層的に構成することもできます。Gaucheのモジュールの多くは既に階層的に
構成されています。具体的なモジュール例はライブラリモジュール - 概要を参照して下さい。
例えば、text.tr
モジュールは “text/tr.scm
” ファイルに
実装されています。パス名の区切り文字‘/’がモジュール名ではピリオドになることに
注意して下さい。