[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!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
```
|
@@ -32,7 +32,7 @@ Max(MSP)やPureDataにおける信号処理のように、信号処理のイ
|
||||
|
||||
これはソースコードの増分比較に基づいている。同じ差分でも、複数の変更のパターンがあり得るので、単なるテキスト比較ではなくEmacsの拡張として操作の履歴を取得している。
|
||||
|
||||
プリミティブを小さくする&&ソースコードの変更→評価の間隔が短くても済むような仕組みを作れべ
|
||||
プリミティブを小さくする&&ソースコードの変更→評価の間隔が短くても済むような仕組みを作れば良い。
|
||||
|
||||
## lambda-mmmの記法
|
||||
|
||||
@@ -78,9 +78,9 @@ Max(MSP)やPureDataにおける信号処理のように、信号処理のイ
|
||||
## 将来的な展望
|
||||
|
||||
|
||||
|
||||
原理的にはFaustでも実現できるはず。
|
||||
|
||||
ディレイ、Feed以外に、外部定義の関数呼び出しにもこの仕組みを応用できるか?LuaのUserData的な仕組み。
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user