From 7b6899d3533a4faf1ed988097d0e647469d2ea2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Mon, 1 Dec 2025 09:32:34 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-12-01 09:32:34 --- ...ィブプログラミングのによる信号処理のライブコーディング.md | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md b/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md index 51f0ecb8..c9f60b1a 100644 --- a/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md +++ b/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md @@ -64,7 +64,7 @@ mimiumはコードを専用のVMバイトコードへコンパイルし実行す 図nにmimiumの内部表現Lambda-mmmに多段階計算の体系を加えた新しい内部表現 $\lambda_{Mmmm}$(Multi-stage version of $\lambda_{mmm}$)のシンタックスを定義する。 -型にはCode Type $`t$を加える +型にはCode Type $`t$を加える。(一般的な多段階計算言語では$\langle\tau\rangle$) $$ \begin{align} \tau ::= @@ -76,7 +76,7 @@ $$ \end{align} $$ -式にはクオート($`e$)とスプライス($\$e$)を加える。これはMetaMLなど代表的な多段階計算言語における$..$と$\textasciitilde e$に対応するものである。mem(e)はシングルサンプルのディレイだが、これは遅延時間のデータを保存する必要がないため通常のディレイと区別して使用される。 +式にはクオート($`e$)とスプライス($\$e$)を加える。これはMetaMLなど代表的な多段階計算言語における$.\langle e\rangle.$と$\textasciitilde e$という記法に対応するものである。 $$ \begin{align} e ::= @@ -87,11 +87,11 @@ e ::= |&\quad e.n \quad& n \in \mathbb{N}\ [proj]&\\ |&\quad \lambda x.e& [abs]&\\ |&\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 &[splice]& + |&\quad $e &[splice]&\\ + |&\quad delay(n,e_{time},v_{bound})&[delay]&\\ + |&\quad mem(e) &[mem]&\\ + |&\quad feed\ x.e &[feed]& \end{align} $$ @@ -105,7 +105,10 @@ v ::= $$ -セマンティクスをどこまで書くか、タプルを入れるか +delay,mem,feedは信号処理用のプリミティブである。mem(e)はシングルサンプルのディレイだが、これは遅延時間のデータを保存する必要がないため通常のディレイと区別して使用される。これら3つのプリミティブはステージ1に束縛された組み込み関数のように扱われ、ステージ0評価で現れるとエラーになる。 + +また、多段階計算において重要な、`run`プリミティブを用いて一つ上のステージで定義されたものをその場で使用する越段階埋め込み(Cross-Stage Persistence)はmimiumでは実装されていない。一方、コンパイル時に計算した数値などをランタイムで使用するために、プリミティブをコード型へ持ち上げる`lift`関数はプリミティブとして用意されている。mimiumの型システムは現時点でジェネリクスを搭載していないため、各基本型毎に異なる名前の組み込み関数(floatに対するlift_fなど)が用意される。 + 操作的意味論 @@ -151,10 +154,10 @@ fn dsp(){ fn 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) } + `|rate| rate + gen!(rate/3)* rate* $multiplier + |> $cascade(n - 1.0 ,gen) }else{ - `{|rate| ($gen)(rate)} + `|rate| gen![]()(rate) } } #stage(main)