--- date: 2024-10-20 12:02 --- #mimium ツリー形式からBasicBlockのインストラクション形式に変える Stateのこととupvalueを両方処理しなくてはならない StateSize計算とUpvalue計算の両方をtraitとして切り出す方がいいのかな ## 値 $$ \begin{align} v \; ::= & \quad R \\ | & (\lambda x:\tau.e, [\Gamma, x:e],StateStorage(p,Vec)) \quad & [Closure]\\ \end{align} $$ $$ \begin{align} e \; ::=& \quad x \quad x \in \mathbb{V} \quad & [value]\\ |& \quad \lambda x.e \quad & [lambda]\\ |& \quad e \; e \quad & [app(global,stateful)]\\ |& \quad appcls \; e \; e \quad & [appclosure]\\ |& \quad fix \; x.e \quad & [fixpoint]\\ |& \quad getstate \; e \; I_n \; I_s \quad & [feed] \\ |& \quad delay \; e \; e & [delay]\\ \end{align} $$ 結局[[The w-calculus a synchronous framework for the verified modelling of digital signal processing algorithms|W計算]]のStaged Interpreterと変わらんかもな そうすると型付けの時点でクロージャ相当の項とグローバル関数適用の項は分かれることになる?エフェクトとして考えるのが妥当なのかな ## 型 $$ \begin{align} \tau ::=&\quad R_a \quad & a \in \mathbb{N}\\ |&\quad I_n \quad &n \in \mathbb{N} \\\ |&\quad \tau → \tau \quad \\ % |&\quad \langle \tau \rangle \end{align} $$ ## コンパイル ```ocaml let compiler = fun e -> match e with Id(x) -> | App(e1,e2)-> | Feed(x,e) -> ```