モジュールとプロジェクト
モジュールシステム
LuneScript では、1つの .lns ファイルが1つのモジュールに対応します。
フォルダ階層はドット . 区切りで表現されます(例: foo/bar.lns → foo.bar)。
// foo/bar.lns
pub fn func() { print("foo.bar"); }
プロジェクト設定 (lune.js)
LuneScript のプロジェクトは、lune.js (または lune.lua) というファイルを配置したディレクトリをルートとして認識されます。
このファイルは JSON 形式で記述します。
{
"cmd_option": [ "--valid-luaval" ]
}
単一の空の JSON {} でも機能しますが、cmd_option を指定することで、プロジェクト全体に適用するコンパイルオプションを管理できます。
lune.js があるディレクトリがモジュールパスの起点となります。foo/lune.js がある場合、foo/bar/mod.lns は bar.mod として扱われます。
Import
他のモジュールを利用するには import を使用します。
import foo.bar;
foo.bar.func();
import foo.bar as baz;
baz.func();
外部 Lua モジュールの利用
Lua の既存モジュールを利用する場合、module キーワードで型定義を行います。
module Math require "math" {
pub static let pi: real;
pub static fn sin( x:real ): real;
}
print( Math.sin( Math.pi / 2.0 ) );
Glue コード生成
Lua (C言語) のモジュールと連携するための Glue コードを自動生成する機能があります。
module 定義に glue キーワードとプレフィックスを指定します。
module External require "test.ext" glue "hoge_" {
pub static fn test(): int;
}
これにより、hoge_ をプレフィックスとした C 言語用のヘッダファイルとソースファイルが生成され、C 側の実装とスムーズに連携できます。
Provide
Lua との互換性のために、特定のシンボルをモジュールの戻り値として公開する場合に使用します。
pub fn func(): int { return 10; }
provide func;
これにより、Lua から require("this_mod") した際に、テーブルではなく関数 func が直接返されます。
Subfile (ファイル分割)
1つのモジュールを複数のファイルに分割する機能です。巨大なモジュールを管理しやすくします。
Main ファイル
// @lnsFront: skip
// main.lns
subfile use sub1;
subfile use sub2;
pub let val = 100;
Sub ファイル
// @lnsFront: skip
// sub1.lns
subfile owner main;
pub fn func() {
print( val ); // main のメンバにアクセス可能
}
subfile use で指定されたファイルは、あたかも main ファイルの一部であるかのように結合されてコンパイルされます。