#mimium #programming-language 

related: [[mimium新内部表現の構想]] [[mimiumの中間表現を考える]] [[mimiumのMIRコンパイル過程を真面目に考える]] 

[[多段階計算]]を[[mimium]]の中にマクロとして取り入れたい.

既存の多段階計算の文献は基本的に[[操作的意味論]]を定義しているため、そのままナイーブに実装するならツリーウォークインタプリタや[[CEKマシン]]的なものにならざるを得ない。

ただmimiumでは既にVMのフォーマットを定めており、マクロ展開やコンパイル時計算をMIRレベルで展開する全く別の処理系をもう一つ作らなければいけないのか？という悩みがある。

一つの方向として、多段階計算の意味論を丸ごとVMの命令列の中に組み込むことはできないだろうか？というのを考える。

## 追加命令

`incl_level / decl_level <dst>`　のような命令があるとする

VMは最初、マクロ評価時に自分の現在の評価ステージを0として評価スタート

VMは、命令記録モードと実行モードの2種類で、現在の評価ステージが0のときに実行モードになる

mainプログラムの先頭はマクロ展開のため必ずincr_levelからスタート＝命令記録モードから開始

命令記録モードでは、decr_levelがでてくるまでバッファに実行した命令をコピーし続ける
decl_levelでレベル0になったら...うーん

```ocaml
let n = 100 in
let m = 200 in
let addc x y = &(~x + ~y) in
  ~(addc &n &m )
```

`addc`の型は`(&int,&int) -> &int`

CodeもEscapeもネストできる構造なんだから命令型に直すとなにかしらのスタック構造を操作するものになるはず
Escapeはあくまで埋め込むだけで評価をするわけじゃないんだよな

`&(~x + ~y)`ここだけ取り出すとどうだろう

`~x`はxを評価した後にエスケープする、ってことだもんなあ

```
fn addc x y // reg 1,2にはプログラム辺のインデックス
startescape
mov 1 x
endescape
startescape
mov 2 y
endescape
add 1 1 2 //最後は必ずこうなるわけで

fn main
movc 1 100
movc 2 200

lift 2 1
lift 3 2
startescape
move 1 "addc"
call 1 2 1
endescape
ret 1
```


VMの構造にメタプログラミングを埋め込むよりも、MIR生成段階でなにかしらのサンクを呼び出すということにして一時的に空にしておく、みたいなやり方のほうが素直かもな


