erg/doc/JA/syntax/33_package_system.md
2022-09-06 09:27:46 +09:00

3.8 KiB

パッケージシステム

badge

Ergのパッケージはアプリケーションであるappパッケージとライブラリであるlibパッケージに大別できます。 appパッケージのエントリポイントはsrc/app.erです。app.er内に定義されたmain関数が実行されます。 libパッケージのエントリポイントはsrc/lib.erです。パッケージをインポートすることはlib.erをインポートすることと等価になります。

パッケージにはモジュールという下位構造があります。Ergにおいてモジュールとはすなわち、Ergファイルもしくはそれで構成されたディレクトリです。外部のErgファイル/ディレクトリはモジュールオブジェクトとして操作可能な対象になるのです。

ディレクトリをモジュールとして認識させるには、ディレクトリ内に(ディレクトリ名).erファイルを置く必要があります。 これはPythonの__init__.pyと同じようなものですが、__init__.pyと違ってディレクトリの外に置きます。

例として、以下のようなディレクトリ構成を考えてみましょう。

└─┬ ./src
  ├─ app.er
  ├─ foo.er
  ├─ bar.er
  └─┬ bar
    ├─ baz.er
    └─ qux.er

app.erではfooモジュールとbarモジュールをインポートできます。barディレクトリがモジュールとして認識できるのはbar.erファイルがあるためです。 fooモジュールはファイルからなるモジュールで、barモジュールはディレクトリからなるモジュールです。barモジュールはさらにbaz, quxモジュールを内部に持ちます。 このモジュールは単にbarモジュールの属性であり、app.erからは以下のようにアクセスできます。

# app.er
foo = import "foo"
bar = import "bar"
baz = bar.baz
# or `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 =
    ...

また、.private.erで終わるファイルはプライベートモジュールであり、同一ディレクトリのモジュールからしかアクセスできません。

└─┬
  ├─ foo.er
  ├─ bar.er
  └─┬ bar
    ├─ baz.private.er
    └─ qux.er
# foo.er
bar = import "bar"
bar.qux
bar.baz # AttributeError: module 'baz' is private
# qux.er
baz = import "baz"

Previous | Next