diff --git a/content/mimiumのモジュールシステム.md b/content/mimiumのモジュールシステム.md index 3f54c5dc..cc64fd18 100644 --- a/content/mimiumのモジュールシステム.md +++ b/content/mimiumのモジュールシステム.md @@ -60,7 +60,7 @@ modname::foo!() これがあったとすると、 ```rust -let modname = ${ +extern modname = ${ foo = | | { }, ... } @@ -77,7 +77,47 @@ modname.foo!() しかし、そうするとラムダ計算として定義する旨味はあんまりないのでは、という気がしてくる +`extern name : Type `という宣言に変換さえできれば意味論を保ってコンパイルはできそう +型がつけられさえすればいいから、そこで循環する定義にならなければOK + +```rust +//modA.mmm +use modB +pub fn hoge(){ + modB::hoge() +} + +//modB.mmm +use modA +pub fn hoge(){ + modA::hoge() +} +``` + +(ランタイムで無限ループするけどそれはいいとして)変換するとこう + +```rust +// modA.mmm +extern modB:{ + hoge: ? +} +fn hoge(){ + modB.hoge() +} + +//modB.mmm +extern modA:{//実際は型コンストラクタとかで覆って区別できるようにすべき + hoge: ? +} +fn hoge(){ + modA.hoge() +} +``` + +`modA::hoge : 'a ()->'a, modB::hoge : 'a ()->'a ` + +ここまでしか型は決定できないということに ---