パッケージシステム
Ergのパッケージはアプリケーションであるappパッケージとライブラリであるlibパッケージに大別できます。
appパッケージのエントリポイントはsrc/app.er
です。app.er
内に定義されたmain
関数が実行されます。
libパッケージのエントリポイントはsrc/lib.er
です。パッケージをインポートすることはlib.er
をインポートすることと等価になります。
パッケージにはモジュールという下位構造があります。Ergにおいてモジュールとはすなわち、Ergファイルもしくはそれで構成されたディレクトリです。外部のErgファイル/ディレクトリはモジュールオブジェクトとして操作可能な対象になるのです。
ディレクトリをモジュールとして認識させるには、ディレクトリ内に__init__.er
ファイルを置く必要があります。
これはPythonの__init__.py
と同じようなものです。
例として、以下のようなディレクトリ構成を考えてみましょう。
└─┬ ./src
├─ app.er
├─ foo.er
└─┬ bar
├─ __init__.er
├─ baz.er
└─ qux.er
app.er
ではfoo
モジュールとbar
モジュールをインポートできます。bar
ディレクトリがモジュールとして認識できるのは__init__.er
ファイルがあるためです。
foo
モジュールはファイルからなるモジュールで、bar
モジュールはディレクトリからなるモジュールです。bar
モジュールはさらにbaz
, qux
モジュールを内部に持ちます。
このモジュールは単にbar
モジュールの属性であり、app.er
からは以下のようにアクセスできます。
# app.er
foo = import "foo"
bar = import "bar"
baz = bar.baz
# または`baz = import "bar/baz"`
main args =
...
サブモジュールにアクセスするための区切り文字が/
であることに注意してください。これは、bar.baz.er
のようなファイル名があり得るためです。
しかしこのようなファイル名は推奨されません。Ergでは.er
の直前の識別子、プレフィックスが意味を持つためです。
例えば、テスト用のモジュールです。.test.er
で終わるファイルは(ホワイトボックス)テスト用のモジュールであり、テスト実行時に@Test
でデコレーションされたサブルーチンが実行されます。
└─┬ ./src
├─ app.er
├─ foo.er
└─ foo.test.er
# app.er
foo = import "foo"
main args =
...
また、__init__.er
内でre-importされていないモジュールはプライベートモジュールであり、同一ディレクトリ内のモジュールからしかアクセスできません。
└─┬
├─ foo.er
└─┬ bar
├─ __init__.er
├─ baz.er
└─ qux.er
# __init__.py
.qux = import "qux" # this is public
# foo.er
bar = import "bar"
bar.qux
bar.baz # AttributeError: module 'baz' is private
# qux.er
baz = import "baz"