Merge remote-tracking branch 'home/v4' into v4
All checks were successful
Build / build (push) Successful in 8m3s

This commit is contained in:
2025-07-20 20:41:07 +09:00
4 changed files with 93 additions and 1 deletions

7
content/Gluon.md Normal file
View File

@@ -0,0 +1,7 @@
#programming-language
[[Rust]]で書かれた、[[Lua]]のような埋め込みを想定しつつ静的型付けの言語。
モジュールの読み込みの文法とか複雑な型情報をRustと相互でやり取りする時のやりかたとか、参考になる
[Gluon](https://gluon-lang.org/)

9
content/Rune.md Normal file
View File

@@ -0,0 +1,9 @@
#programming-language
[The Rune Programming Language](https://rune-rs.github.io/)
[[Rust]]で書かれた埋め込みプログラミング言語。
Rustの文法ほぼそのままに動的型付けの言語をつくるとこうなる、みたいな感じ
[[Moonbit]]とか[[Rhai]]も近い感じRhaiは直接影響を受けたとのこと

View File

@@ -30,7 +30,12 @@ https://github.com/mimium-org/mimium-rs
- [[mimiumのMIRコンパイル過程を真面目に考える]]
- [[lambda-mmm(実用版)]]
- [[mimiumグローバル環境評価について]]
- [[多段階計算を命令型VMインストラクションで表現したい]]
## マクロ
- [[mimiumと多段階計算]]
### ランタイム周りについて

View File

@@ -0,0 +1,71 @@
#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からの値を取れる、サンクをアンラップするようなメソッドを持つ型クラスに属している、という感じで、ジェネリクスが実装出来たらいけそうね
## マクロを提供するプラグイン
プラグインも、各関数が返す型と同時にどのレベルでその関数が使えるかをコンパイラに渡す必要がある
### ファイル読み込みはどうなる?
[[mimiumのファイルIO]]の話。マクロの展開より先に型の評価が行われるので、例えばファイルを読み込んでからチャンネル数が分かる、みたいな場合型情報を読み込む段階でファイルを読みこまなければならない、がその評価のためにはマクロを実行して文字列の値を受け取らなければならない、、、ということで、結局[[依存型]]がないと多段階計算でも対応できない。
結局、読み込んで返す値として次元数の値を持つ配列を返すしかないのかも