Gleamのモジュールシステム
モジュールの概要
Gleamのモジュールは以下のような仕様をしている。
gleam runで実行されるのはsrc/直下のプロジェクト名を冠したGleamモジュール。
import modnameでsrc/配下のモジュールにアクセスできる。
ディレクトリがある場合もimport dirname/modnameでアクセスできる。
import modname.{funcname, type TypeName}で非修飾インポートが可能。(Pythonのimport fromみたいなやつ)
循環参照はできない。コンパイル時に検出されエラーになる。
プロジェクトの内部モジュール同士のimportは全てsrc/を起点に行なう。
慣例
import pathの統一
Lustreの関連ライブラリは全てimport lustre/*で統一されている。 これを実現するために関連ライブラリのモジュールは全てsrc/lustre/*内に配置されている。
自動生成されたモジュールによる名前空間の確保
Gleezではgleam run -m gleez add buttonのようにコンポーネントを生成するコマンドがある。 これらのコマンドを実行するとsrc/にcomponent/ui/buttonというモジュールが生成される。
これらのモジュールはimport component/ui/buttonという風にimportできる。
自動生成するモジュールのディレクトリを共通化することでimport pathに一貫性を持たせられる。
内部モジュール
gleam.tomlのinternal_modulesにモジュール名を指定するとドキュメントから除外される。
これによりモジュールの単体テストと非公開性を両立した事実上の内部モジュールを実現できる。
code:toml
internal_modules = [
"project_name/internal", # src/project_name/internal.gleam が除外される
"project_name/internal/*", # src/project_name/internal/*.gleam が除外される
"internal/*" # src/internal/*.gleamが除外される
]
例
modname.funcname()で呼び出したい
code:rust
// modname.gleam
pub fn funcname() {
todo
}
pkgname/modname.funcname()で呼び出したい
code:rust
// pkgname/modname.gleam
pub fn funcname() {
todo
}