Files
quartz-research-note/content/mimiumと多段階計算.md
Matsuura Tomoya(Windows) 101d6203a3
Some checks failed
Build / build (push) Failing after 10m7s
[obsidian] vault backup: 2025-07-20 11:34:26[
2025-07-20 11:34:27 +09:00

2.9 KiB
Raw Blame History

#memo #mimium

Implement multi-stage computation intepreter by tomoyanonymous · Pull Request #136 · mimium-org/mimium-rs · GitHub

シンプルに構文木レベルでのインタプリタを別途作ることで実現できそう。

課題

  • 組み込みの関数の型情報がマクロ用レベル0とVM用レベル1で分かれているので、両方にあることを別々に宣言しなければならない
    • 逆に、ベクターのappend・removeや文字列操作など、メモリを確保する操作はレベル0でのみ利用できる組み込み関数として制限すると、便利かもしれない
    • 逆に、selfdelayはレベル1でのみ利用できる関数とする
    • レベル01両方で利用できるpersistentなモジュールは、上記2種類のいずれも使わず、かつescapeとBracketも利用しないものであればよい、ということになる
  • もともとディレイの最大サイズはリテラルで指定しなければいけないという問題があったが、これをmake_delay(size:float)-> <(float,float)->float>レベル0で最大時間を指定すると、入力と遅延時間をとる関数のコードを返すという関数にできるかも
fn fbdelay(max_time){
  `|input,time,fb| {
    (input + self*fb, time) |> make_delay!(max_time)
   }
}
  • こういうfbdelayを2個以上つかうときのコードはどうなるのかな
    • というか、fbdelayで生成されたコードをMIRに持ってくときにどうなるのか
    • Value型を単なるCodeじゃなくてDelayとして特別な値にリダクションすればいいのかな

otopoiesisでパラメーターを生成するのにも使える?

fn synth(freq,gate){
  osc(freq)*gate
}

fn synth_module(freq:()->float,gate:()->float){
 `||{ synth(freq(),gate()) }
}

これのモジュールを評価すると、freq,gateがUIに現れるという感じでできるのかなそして、ここでUIの範囲制限をするためにも数値型が範囲を持っていた方がいいということになりそう

うーん、サンクを手動で使わず表現できるような何かが欲しいなあ

fn wrap_module(param:Param, synth:(Param)->float ){
  `{ | | synth(param |> invoke) }
}

Param型はinvokeでuiからの値を取れる、サンクをアンラップするようなメソッドを持つ型クラスに属している、という感じで、ジェネリクスが実装出来たらいけそうね