Compare commits

..

3 Commits

Author SHA1 Message Date
1bff761354 Merge remote-tracking branch 'home/v4' into v4
Some checks failed
Build / build (push) Failing after 8m12s
2025-12-01 09:33:09 +09:00
449c752bd6 [obsidian] vault backup: 2025-12-01 09:32:34 2025-12-01 09:32:34 +09:00
81b0bb35a5 [obsidian] vault backup: 2025-12-01 09:18:13[ 2025-12-01 09:18:13 +09:00
2 changed files with 46 additions and 13 deletions

View File

@@ -60,13 +60,11 @@ mimiumはコードを専用のVMバイトコードへコンパイルし実行す
## 多段階計算 ## 多段階計算
多段階計算は、型付きラムダ計算に対して、計算のステージを複数段階に分割する明示的なシンタックスを導入するものである。Lisp系言語のquote/splice機能[@lisp]のように、部分的に計算したコード片を埋め込むようなものを想定しているが、不正な値が埋め込まれないことを型システムとして保証することが特徴である逆に、通常マクロに期待される型システムの範囲を超えたメタ操作を行うことは許されない。実用的な例では、Scala 3でのマクロや、関数型組版処理エンジンSaTysFi[@suwa2024]のように、言語内DSLを型安全にライブラリとして実装することを想定しているものがある。mimiumにおいては、多段階計算はコンパイル時に行う計算シグナルグラフのルーティングの決定と、ランタイム時に行う計算実際のオーディオ処理を区別するのに用いている。 多段階計算は、型付きラムダ計算に対して、計算のステージを複数段階に分割する明示的なシンタックスを導入するものである。Lisp系言語のquote/splice機能[@lisp]のように、部分的に計算したコード片を埋め込むようなものを想定しているが、不正な値が埋め込まれないことを型システムとして保証することが特徴である逆に、通常マクロに期待される型システムの範囲を超えたメタ操作を行うことは許されない。実用的な例では、Scala 3でのマクロや、関数型組版処理エンジンSaTysFi[@suwa2024]のように、言語内DSLを型安全にライブラリとして実装することを想定しているものがある。mimiumにおいては、多段階計算はコンパイル時に行う計算シグナルグラフのルーティングの決定と、ランタイム時に行う計算実際のオーディオ処理を区別するのに用いている。
### シンタックスの拡張 ### シンタックスの拡張
図nにmimiumの内部表現Lambda-mmmに多段階計算の体系を加えた新しい内部表現 $\lambda_{Mmmm}$(Multi-stage version of $\lambda_{mmm}$)のシンタックスを定義する。 図nにmimiumの内部表現Lambda-mmmに多段階計算の体系を加えた新しい内部表現 $\lambda_{Mmmm}$(Multi-stage version of $\lambda_{mmm}$)のシンタックスを定義する。
型にはCode Type $\langle t\rangle$を加える 型にはCode Type $`t$を加える。(一般的な多段階計算言語では$\langle\tau\rangle$
$$ $$
\begin{align} \begin{align}
\tau ::= \tau ::=
@@ -74,11 +72,11 @@ $$
|&\quad I_n \quad &n \in \mathbb{N} \\ |&\quad I_n \quad &n \in \mathbb{N} \\
|&\quad \tau_1 → \tau_2 &\\ |&\quad \tau_1 → \tau_2 &\\
|&\quad (\tau_1,\tau_2,...) &\\ |&\quad (\tau_1,\tau_2,...) &\\
|&\quad \langle \tau \rangle |&\quad ` \tau
\end{align} \end{align}
$$ $$
式にはクオートとスプライスを加える。mem(e)はシングルサンプルのディレイだが、これは遅延時間のデータを保存する必要がないため通常のディレイと区別して使用される。 式にはクオート$`e$)とスプライス($\$e$)を加える。これはMetaMLなど代表的な多段階計算言語における$.\langle e\rangle.$と$\textasciitilde e$という記法に対応するものである。
$$ $$
\begin{align} \begin{align}
e ::= e ::=
@@ -89,11 +87,11 @@ e ::=
|&\quad e.n \quad& n \in \mathbb{N}\ [proj]&\\ |&\quad e.n \quad& n \in \mathbb{N}\ [proj]&\\
|&\quad \lambda x.e& [abs]&\\ |&\quad \lambda x.e& [abs]&\\
|&\quad let\; x\; =\; e_1\; in\; e_2& [let]&\\ |&\quad let\; x\; =\; e_1\; in\; e_2& [let]&\\
|&\quad delay(x,e_{time},v_{bound})&[delay]&\\
|&\quad mem(e) &[mem]&\\
|&\quad feed\ x.e &[feed]&\\
|&\quad `e &[quote]&\\ |&\quad `e &[quote]&\\
|&\quad $e &[splice]& |&\quad $e &[splice]&\\
|&\quad delay(n,e_{time},v_{bound})&[delay]&\\
|&\quad mem(e) &[mem]&\\
|&\quad feed\ x.e &[feed]&
\end{align} \end{align}
$$ $$
@@ -107,7 +105,10 @@ v ::=
$$ $$
セマンティクスをどこまで書くか、タプルを入れるか delay,mem,feedは信号処理用のプリミティブである。mem(e)はシングルサンプルのディレイだが、これは遅延時間のデータを保存する必要がないため通常のディレイと区別して使用される。これら3つのプリミティブはステージ1に束縛された組み込み関数のように扱われ、ステージ評価で現れるとエラーになる。
また、多段階計算において重要な、`run`プリミティブを用いて一つ上のステージで定義されたものをその場で使用する越段階埋め込みCross-Stage Persistenceはmimiumでは実装されていない。一方、コンパイル時に計算した数値などをランタイムで使用するために、プリミティブをコード型へ持ち上げる`lift`関数はプリミティブとして用意されている。mimiumの型システムは現時点でジェネリクスを搭載していないため、各基本型毎に異なる名前の組み込み関数floatに対するlift_fなどが用意される。
操作的意味論 操作的意味論
@@ -153,10 +154,10 @@ fn dsp(){
fn cascade(n,gen){ fn cascade(n,gen){
if (n>0.0){ if (n>0.0){
let multiplier = 1.0-(1.0/(n*3)) |> lift_f let multiplier = 1.0-(1.0/(n*3)) |> lift_f
`{|rate| rate + ($gen)(rate/3)* 0.5 * rate* $multiplier `|rate| rate + gen!(rate/3)* rate* $multiplier
|> $cascade(n - 1.0 ,gen) } |> $cascade(n - 1.0 ,gen)
}else{ }else{
`{|rate| ($gen)(rate)} `|rate| gen![]()(rate)
} }
} }
#stage(main) #stage(main)
@@ -169,6 +170,33 @@ fn dsp(){
(r,r) (r,r)
} }
``` ```
```rust
`{
${
let cascade = |n,gen|{
if (n>0.0){
let multiplier = 1.0-(1.0/(n*3)) |> lift_f
`{|rate| rate + ($gen)(rate/3)* 0.5 * rate* $multiplier
|> $cascade(n - 1.0 ,gen) }
}else{
`{|rate| ($gen)(rate)}
}
}
`{
let osc = | | {
...
}
let dsp = | |{
let f = 200
let r = f |> cascade!(20,`osc)
(r,r)
}
}
}
}
```
## コールツリーの解析 ## コールツリーの解析
```rust ```rust