All checks were successful
Build / build (push) Successful in 10m47s
79 lines
1.9 KiB
Markdown
79 lines
1.9 KiB
Markdown
---
|
||
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}
|
||
$$
|
||
|
||
## コンパイル
|
||
|
||
```rust
|
||
fn eval(e:ExprNodeId,env:Env<Value>)->(Value,Type){
|
||
match e.to_expr() {
|
||
Expr::Id(name)=>{
|
||
env.lookup(name)
|
||
|
||
},
|
||
Expr::Let(name,e,body)=>{
|
||
let env = env.extend((name,eval(e,env).0));
|
||
eval(e,env)
|
||
},
|
||
Expr::App(e,args)=>{
|
||
let (f,ft) = eval(e,env);
|
||
let argvs = args.iter().map(|e| eval(e,env));
|
||
match f{
|
||
Value::Closure(fproto,names,body,env)=>{
|
||
let kvs = names.iter().zip(argvs.zip()).collect()
|
||
let env = env.extend(kvs);
|
||
eval(body,env)
|
||
}
|
||
_=>panic!()
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
``` |