From a1ed1f1f74ad57ada462e57cb207b7ec3752f66e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Thu, 25 Sep 2025 13:38:52 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-09-25 13:38:52[ --- ...miumのMIRコンパイル過程を真面目に考える.md | 33 +++++++++++++++---- ...グ言語のソース変更時に内部状態を差分保持するシステム.md | 4 +-- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/content/mimiumのMIRコンパイル過程を真面目に考える.md b/content/mimiumのMIRコンパイル過程を真面目に考える.md index 6230efd7..445c0b19 100644 --- a/content/mimiumのMIRコンパイル過程を真面目に考える.md +++ b/content/mimiumのMIRコンパイル過程を真面目に考える.md @@ -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,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!() + } + } + } + +} ``` \ No newline at end of file diff --git a/content/関数型信号処理プログラミング言語のソース変更時に内部状態を差分保持するシステム.md b/content/関数型信号処理プログラミング言語のソース変更時に内部状態を差分保持するシステム.md index 49eb3d55..e6391d00 100644 --- a/content/関数型信号処理プログラミング言語のソース変更時に内部状態を差分保持するシステム.md +++ b/content/関数型信号処理プログラミング言語のソース変更時に内部状態を差分保持するシステム.md @@ -32,7 +32,7 @@ Max(MSP)やPureDataにおける信号処理のように、信号処理のイ これはソースコードの増分比較に基づいている。同じ差分でも、複数の変更のパターンがあり得るので、単なるテキスト比較ではなくEmacsの拡張として操作の履歴を取得している。 -プリミティブを小さくする&&ソースコードの変更→評価の間隔が短くても済むような仕組みを作れべ +プリミティブを小さくする&&ソースコードの変更→評価の間隔が短くても済むような仕組みを作れば良い。 ## lambda-mmmの記法 @@ -78,9 +78,9 @@ Max(MSP)やPureDataにおける信号処理のように、信号処理のイ ## 将来的な展望 - 原理的にはFaustでも実現できるはず。 +ディレイ、Feed以外に、外部定義の関数呼び出しにもこの仕組みを応用できるか?LuaのUserData的な仕組み。