Gaucheは大きなソフトウェアをモジュール化して開発するための、 単純なモジュールシステムを備えています。
高レベルのインタフェースを使うのはユーザにとっては非常に簡単です。
モジュールfoo
が提供する機能を使いたければ、
プログラム中で(use foo)
と表記するだけです。
このフォームはマクロで、コンパイル時に解釈されます。
通常は、foo
の機能を実装したファイルをロードし、
その外部APIを呼び出したモジュール中にインポートします。
use
メカニズムは、名前空間の分離とファイルローディングという
二つの独立な低レベルのメカニズムの上に実装されています。
これらの低レベルメカニズムはそれぞれ別々に使うこともできます。
use
メカニズムは非遷移的です。すなわち、
モジュールBがモジュールAを’use’し、さらにモジュールCがモジュールBを
’use’している場合、モジュールCからはモジュールA内の束縛は見えません。
BとAはis-a
関係ではないためです。
例えばモジュールAが低レベルの操作を実装し、
モジュールBがその上に高レベルの抽象的なインタフェースを実装しているとしましょう。
モジュールCがモジュールBを’use’しているということは、
CはBの提供する抽象レイヤに興味があるということです。
もしCがさらに低レベルの層にもアクセスしたいならば、CはAを明示的に’use’しなければ
なりません。
しかし、別の形の関係が必要な場合もあります。例えば既存のモジュールAに
ちょっと新しいインタフェースを付け加えたモジュールBをAの拡張として
提供したいという場合です。この時、BとAはis-a
関係であり、Bを’use’
しているモジュールからA内の束縛も見えるのが自然です。
Gaucheでは、これをモジュールの継承と呼び、
extend
フォームにより実現しています。
以下のセクションでモジュールの機能について詳しく説明しています。