[obsidian] vault backup: 2025-09-25 13:38:52[
All checks were successful
Build / build (push) Successful in 10m47s
All checks were successful
Build / build (push) Successful in 10m47s
This commit is contained in:
@@ -5,7 +5,7 @@ date: 2024-10-20 12:02
|
||||
|
||||
ツリー形式からBasicBlockのインストラクション形式に変える
|
||||
|
||||
Stateのこととupvalueを両方処理しなくてはならない
|
||||
Stateのこととupvalueを両方処理しなくてはならない。ワンパスで処理できるのか?
|
||||
|
||||
StateSize計算とUpvalue計算の両方をtraitとして切り出す方がいいのかな
|
||||
|
||||
@@ -48,11 +48,32 @@ $$
|
||||
|
||||
## コンパイル
|
||||
|
||||
```ocaml
|
||||
let compiler = fun e -> match e with
|
||||
Id(x) ->
|
||||
| App(e1,e2)->
|
||||
| Feed(x,e) ->
|
||||
```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!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
```
|
Reference in New Issue
Block a user