All checks were successful
Build / build (push) Successful in 6m53s
71 lines
1.3 KiB
Markdown
71 lines
1.3 KiB
Markdown
#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 }
|
|
|
|
|
|
``` |