For Development HEAD DRAFTSearch (procedure/syntax/module):

3.8 Gaucheのモジュールを書く

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” ファイルに 実装されています。パス名の区切り文字‘/’がモジュール名ではピリオドになることに 注意して下さい。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT