mimium
元々のLambda-mmmは実際に使われているmimiumでの中間表現と比べて以下のような差がある
- タプルなど構造化された型がない(実際にはVMの命令にワードサイズの情報を付加しているのでこれは結構重要)
- letで宣言された変数に対しては代入ができる(部分的に参照型が使われている)
- delayやfeedの項を終端の値として扱う意味論(コンパイル時の正規化作業)と、実際の評価に使われる意味論が混ざっている
型
τ::=∣∣∣∣unitRInτ∗ττ→τn∈N
値
v::=∣∣∣∣∣unitRv∗vλx.edelay(e,etime,vbound)feed x.eR∈R
項
ep::=∣e::=∣∣∣.∣∣∣∣unitRepe,exλx.eletx=eineeedelay(e,etime,ebound)feedx.eR∈R[tuple][var][abs][let][app][delay][feed]
評価環境(正規化時)
E::=()∣E::(x,v)
正規化の操作的意味論
E⊢delayeetimeebound⇓delayeetimevboundE⊢ebound⇓vboundEn⊢ λx.e⇓cls(λx.e,En) En,x↦v2 ⊢ feed x e⇓v1En−1⊢e⇓v1 En,x↦v1⊢e⇓v2 En⊢ if(ec) et else et⇓vEn⊢ec⇓nn>0 En⊢et ⇓v En⊢ if(ec) et else et⇓vEn⊢ec⇓nn≦0 En⊢ee ⇓v En⊢ e1 e2⇓vEn⊢e1⇓cls(λxc.ec,Ecn)En⊢e2⇓v2 Ecn, xc↦v2⊢ec⇓v [E-DELAY][E-LAM][E-FEED][E-IFTRUE][E-IFFALSE][E-APP]