#mimium モジュールシステムの意味論と実装について考える ### 必要要件 分割コンパイルできる、かつ、意味論的にもある程度一貫性がある #### モジュール内での宣言一覧 ```rust //関数のvisibilityセッティングはRustとおなじ感じ pub fn (){ } pub const Foo = 100 type Bar = Constructor(()->float) //新しい型宣言 type alias Hoge = ()->float //エイリアス宣言 ``` #### モジュールの宣言 ```rust mod(macro) modname{ //toplevel_decls } ``` - モジュール単位でMIRとバイトコードを生成して、あとからリンクできるようにする - ただし、ステージ0マクロの展開もしないといけないので、ASTも出力して保持していないといけない #### 意味論 ```rust stage(1) mod(0) modname{ //toplevel_decls fn foo(){ ... } } modname::foo!() ``` これがあったとすると、 ```rust let modname = ${ foo = | | { }, ... } modname.foo!() ``` こういう感じかなー、あ、でもこうするとモジュール内での相互参照が解決できないか --- ``` Program = FunctionDefinition |GlobalDeclaration |ModuleDeclaration |use ModuleName ModuleDeclaration = Visibility(stage) { Program } ```