[obsidian] vault backup: 2025-12-01 09:18:13[
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -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$を加える
|
||||||
$$
|
$$
|
||||||
\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など代表的な多段階計算言語における$.<e>.$と$\textasciitilde e$に対応するものである。mem(e)はシングルサンプルのディレイだが、これは遅延時間のデータを保存する必要がないため通常のディレイと区別して使用される。
|
||||||
$$
|
$$
|
||||||
\begin{align}
|
\begin{align}
|
||||||
e ::=
|
e ::=
|
||||||
@@ -169,6 +167,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
|
||||||
|
|||||||
Reference in New Issue
Block a user