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

60 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#memo #mimium
- [[多段階計算を命令型VMインストラクションで表現したい]]
- 一時期考えていたが、あんまり筋が良くないのでやめた
[Implement multi-stage computation intepreter by tomoyanonymous · Pull Request #136 · mimium-org/mimium-rs · GitHub](https://github.com/mimium-org/mimium-rs/pull/136)
シンプルに構文木レベルでのインタプリタを別途作ることで実現できそう。
## 課題
- 組み込みの関数の型情報がマクロ用レベル0とVM用レベル1で分かれているので、両方にあることを別々に宣言しなければならない
- 逆に、ベクターのappend・removeや文字列操作など、メモリを確保する操作はレベル0でのみ利用できる組み込み関数として制限すると、便利かもしれない
- 逆に、`self``delay`はレベル1でのみ利用できる関数とする
- レベル01両方で利用できるpersistentなモジュールは、上記2種類のいずれも使わず、かつescapeとBracketも利用しないものであればよい、ということになる
- もともとディレイの最大サイズはリテラルで指定しなければいけないという問題があったが、これを`make_delay(size:float)-> <(float,float)->float>`レベル0で最大時間を指定すると、入力と遅延時間をとる関数のコードを返すという関数にできるかも
- ただ、これやるとディレイが絡む関数はすべてレベル0定義になるのかな
- なんかそれよりは、[[数値プリミティブ型に常に範囲をつける]]とかのほうが筋がいいかも
```rust
fn fbdelay(max_time){
`|input,time,fb| {
(input + self*fb, time) |> make_delay!(max_time)
}
}
```
- こういうfbdelayを2個以上つかうときのコードはどうなるのかな
- というか、fbdelayで生成されたコードをMIRに持ってくときにどうなるのか
- Value型を単なるCodeじゃなくてDelayとして特別な値にリダクションすればいいのかな
[[otopoiesis]]でパラメーターを生成するのにも使える?
```rust
fn synth(freq,gate){
osc(freq)*gate
}
fn synth_module(freq:()->float,gate:()->float){
`||{ synth(freq(),gate()) }
}
```
これのモジュールを評価すると、freq,gateがUIに現れるという感じでできるのかなそして、ここでUIの範囲制限をするためにも数値型が範囲を持っていた方がいいということになりそう
うーん、サンクを手動で使わず表現できるような何かが欲しいなあ
```rust
fn wrap_module(param:Param, synth:(Param)->float ){
`{ | | synth(param |> invoke) }
}
```
Param型はinvokeでuiからの値を取れる、サンクをアンラップするようなメソッドを持つ型クラスに属している、という感じで、ジェネリクスが実装出来たらいけそうね