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になったら…うーん

let n = 100 in<!-- line:27 -->
let m = 200 in<!-- line:28 -->
let addc x y = &(~x + ~y) in<!-- line:29 -->
  ~(addc &n &m )<!-- line:30 -->

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

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

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

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

fn addc x y // reg 1,2にはプログラム辺のインデックス<!-- line:43 -->
startescape<!-- line:44 -->
mov 1 x<!-- line:45 -->
endescape<!-- line:46 -->
startescape<!-- line:47 -->
mov 2 y<!-- line:48 -->
endescape<!-- line:49 -->
add 1 1 2 //最後は必ずこうなるわけで<!-- line:50 -->
<!-- line:51 -->
fn main<!-- line:52 -->
movc 1 100<!-- line:53 -->
movc 2 200<!-- line:54 -->
<!-- line:55 -->
lift 2 1<!-- line:56 -->
lift 3 2<!-- line:57 -->
startescape<!-- line:58 -->
move 1 "addc"<!-- line:59 -->
call 1 2 1<!-- line:60 -->
endescape<!-- line:61 -->
ret 1<!-- line:62 -->

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