From 34f1574108cd4c8de774a966a83880caed9efece 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: Fri, 19 Dec 2025 17:28:30 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-12-19 17:28:30[ --- content/lambda-mmm(実用版).md | 82 ++++++++++++++ ...ƒ†ã‚£ãƒ–プログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md | 102 +++++------------- 2 files changed, 111 insertions(+), 73 deletions(-) diff --git a/content/lambda-mmm(実用版).md b/content/lambda-mmm(実用版).md index d5d539c2..c84b852e 100644 --- a/content/lambda-mmm(実用版).md +++ b/content/lambda-mmm(実用版).md @@ -83,4 +83,86 @@ $$ &\frac{E^n \vdash e_c \Downarrow n \quad n \leqq0\ E^n \vdash e_e\ \Downarrow v\ }{E^n \vdash\ if (e_c)\ e_t\ else\ e_t \Downarrow v }\ &\textrm{[E-IFFALSE]}\\ &\frac{E^n \vdash e_1 \Downarrow cls(\lambda x_c.e_c, E^n_c) E^n \vdash e_2 \Downarrow v_2\ E^n_c,\ x_c \mapsto v_2 \vdash e_c \Downarrow v }{E^n \vdash\ e_1\ e_2 \Downarrow v }\ &\textrm{[E-APP]} \end{gathered} + $$ + +## 実用スモールステップæ„味論 + +アイデア:クロージャ呼ã³å‡ºã—ã¨ãれ以外ã®é–¢æ•°å‘¼ã³å‡ºã—(グローãƒãƒ«ã«ç™»éŒ²ã•れãŸã‚‚ã®ã¨å³æ™‚呼ã³å‡ºã—ã•れるもã®ã¨ã‹ï¼‰ã‚’分ã‘よㆠ+ +OCamlã§ã®ç–‘似コード(未完æˆï¼‰ + +```Ocaml +type expr = NumLit of float + | Var of string + | App of expr * expr + | Lam of string * expr + | Delay of int * expr * expr + | Feed of string * expr + | Quote of expr + | Splice of expr + | Tuple of expr list + | Proj of expr * int +type bound = string * value +and env = bound list +and value = Real of float + | OpenFn of string * expr * int + | Closure of string * expr * env + | Code of expr +type state = float list +type stage = int +type stateptr = int + +let lookup: string->env->value = + fun name env -> let finder = fun (n,v) -> n == name in + let (_n,v) = List.find finder env in + v + + + +let rec contain_freevars: string -> expr -> env -> bool = + ... + + +let states = ... in +let stateptr = 0 in +let rec eval : stage -> expr -> env -> value = + fun stage e env -> match e with +| Var(name) -> + lookup env name +| Lam(x,e) -> + if contains_freevar(e) then OpenFn(x,e,statesize e) + else Closure(x,e,env) +| App(ef,ea) -> + let va = eval stage ea env in + let vf = eval stage ef env in + match vf with + | OpenFn(x,e,size)-> let r = eval stage e ((x,va)::env) in + shift stateptr size; + r + | Closure(x,e,cenv) -> eval stage e ((x,va)::cenv) +| Delay(n,et,ev) -> + let v = eval stage ev env in + let vt = eval stage et env in + update_ringbuf state stateptr v vt +| Feed(x,e)-> + let size = statesize e in + let last = getstate state stateptr in + let current = eval stage e ((x,last)::env) + state[stateptr] := current; + last +| Quote(e)-> + rebuild stage+1 e env +| Splice(e)-> + let v = rebuild stage-1 e env + match v with + | Code(e) -> eval e env + _-> raise +and rebuild : stage -> expr -> env = +fun stage e env -> + if stage == 0 then eval e env + else Code(e) + + +``` + diff --git a/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md b/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md index 1b994a58..752c403e 100644 --- a/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md +++ b/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md @@ -45,7 +45,9 @@ mimiumã¯ã‚³ãƒ¼ãƒ‰ã‚’専用ã®VMãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰ã¸ã‚³ãƒ³ãƒ‘イルã—実行㙠コンパイラã¯ã€çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®èª­ã¿å‡ºã—ä½ç½®ãƒã‚¤ãƒ³ã‚¿ã‚’相対的ã«å‰å¾Œã•ã›ã‚‹å‘½ä»¤ã‚’é©åˆ‡ã«å‡ºåŠ›ã™ã‚‹ã“ã¨ã§ã€VM実行時ã«ã¯ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ç‰¹å®šé ˜åŸŸã‚’フィードãƒãƒƒã‚¯ã®çŠ¶æ…‹å¤‰æ•°ã‚„ãƒ‡ã‚£ãƒ¬ã‚¤ç”¨ã®ãƒªãƒ³ã‚°ãƒãƒƒãƒ•ã‚¡ã¨ã—ã¦è§£é‡ˆã—ãƒ‡ãƒ¼ã‚¿ã‚’èª­ã¿æ›¸ãã™ã‚‹ã€‚ -éŽåŽ»ã®mimiumã§ã¯é«˜éšŽé–¢æ•°ãªã©ã‚’使ã†ã“ã¨ã«ã‚ˆã£ã¦ä»»æ„ã®æ•°ã®ãƒ•ィルタãƒãƒ³ã‚¯ã®ã‚ˆã†ãªã€ãƒ‘ラメトリックãªãƒ—ロセッサを生æˆã™ã‚‹ã“ã¨ã‚‚ã§ããŸãŒã€ã“ã†ã—ãŸãƒ—ロセッサã¯çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºã‚’ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«æ™‚ã«æ±ºå®šã§ããªã‹ã£ãŸã€‚ãã®ãŸã‚ã€ã‚°ãƒ­ãƒ¼ãƒãƒ«ãªé–¢æ•°ã®å‘¼ã³å‡ºã—ã¨ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ï¼ˆå®Ÿè¡Œæ™‚ã«é«˜éšŽé–¢æ•°ã‹ã‚‰ç”Ÿæˆã•れる関数)ã®å‘¼ã³å‡ºã—ã¯åŒºåˆ¥ã•れã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«å€‹åˆ¥ã®çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’ç”Ÿæˆã—ã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£å‘¼ã³å‡ºã—時ã«ä½¿ç”¨ã™ã‚‹çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãã®ã‚‚ã®ã‚’切り替ãˆã‚‹ã“ã¨ã§å¯¾å¿œã—ã¦ã„ãŸã€‚ +éŽåŽ»ã®mimiumã§ã¯é«˜éšŽé–¢æ•°ãªã©ã‚’使ã†ã“ã¨ã«ã‚ˆã£ã¦ä»»æ„ã®æ•°ã®ã‚ªã‚·ãƒ¬ãƒ¼ã‚¿ãƒ¼ãƒãƒ³ã‚¯ã®ã‚ˆã†ãªã€ãƒ‘ラメトリックãªãƒ—ロセッサを生æˆã™ã‚‹ã“ã¨ã‚‚ã§ããŸãŒã€ã“ã†ã—ãŸãƒ—ãƒ­ã‚»ãƒƒã‚µã¯æœ¬è³ªçš„ã«çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºã‚’ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«æ™‚ã«æ±ºå®šã§ããªã„。ã“れã¯ifæ–‡ãªã©ã‚’通ã˜ã¦è¤‡æ•°ã‚µã‚¤ã‚ºã®çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’æ“作ã™ã‚‹é–¢æ•°ãŒä¸€ã¤ã®å¤‰æ•°ã«ç¸®ç´„ã•れã†ã‚‹ãŸã‚ã§ã‚る。 + +ãã®ãŸã‚mimiumã§ã¯ã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ï¼ˆå®Ÿè¡Œæ™‚ã«é«˜éšŽé–¢æ•°ã‹ã‚‰ç”Ÿæˆã•れる関数)ã¨ã€ãã†ã§ãªã„自由変数をキャプãƒãƒ£ã—ãªã„関数ã®å‘¼ã³å‡ºã—を区別ã—ã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã¯å€‹åˆ¥ã®çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’ç”Ÿæˆã—ã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£å‘¼ã³å‡ºã—時ã«ä½¿ç”¨ã™ã‚‹çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãã®ã‚‚ã®ã‚’切り替ãˆã‚‹ã“ã¨ã§å¯¾å¿œã—ã¦ã„る。 ä»Šå›žææ¡ˆã™ã‚‹ãƒ©ã‚¤ãƒ–コーディング機能ã¯ã€2ã¤ã®æ©Ÿèƒ½è¿½åŠ ã«ã‚ˆã£ã¦å®Ÿç¾ã•れる。 @@ -108,60 +110,7 @@ delay,mem,feedã¯ä¿¡å·å‡¦ç†ç”¨ã®ãƒ—リミティブã§ã‚る。mem(e)ã¯ã‚·ãƒ³ ã¾ãŸã€å¤šæ®µéšŽè¨ˆç®—ã«ãŠã„ã¦é‡è¦ãªã€`run`プリミティブを用ã„ã¦ä¸€ã¤ä¸Šã®ã‚¹ãƒ†ãƒ¼ã‚¸ã§å®šç¾©ã•れãŸã‚‚ã®ã‚’ãã®å ´ã§ä½¿ç”¨ã™ã‚‹è¶Šæ®µéšŽåŸ‹ã‚è¾¼ã¿ï¼ˆCross-Stage Persistence)ã¯mimiumã§ã¯å®Ÿè£…ã•れã¦ã„ãªã„。一方ã€ã‚³ãƒ³ãƒ‘イル時ã«è¨ˆç®—ã—ãŸæ•°å€¤ãªã©ã‚’ランタイムã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ã€ãƒ—ãƒªãƒŸãƒ†ã‚£ãƒ–ã‚’ã‚³ãƒ¼ãƒ‰åž‹ã¸æŒã¡ä¸Šã’ã‚‹`lift`関数ã¯ãƒ—リミティブã¨ã—ã¦ç”¨æ„ã•れã¦ã„る。mimiumã®åž‹ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾æ™‚点ã§ã‚¸ã‚§ãƒãƒªã‚¯ã‚¹ã‚’æ­è¼‰ã—ã¦ã„ãªã„ãŸã‚ã€å„基本型毎ã«ç•°ãªã‚‹åå‰ã®çµ„ã¿è¾¼ã¿é–¢æ•°ï¼ˆfloatã«å¯¾ã™ã‚‹lift_fãªã©ï¼‰ãŒç”¨æ„ã•れる。 - -### æ“作的æ„味論 - -```ocaml -let states = ... in -let stateptr = 0 in -let rec eval : stage -> expr -> env -> value = - fun stage e env -> match e with -| Var(name) -> - lookup env name -| Lam(x,e) -> - if contains_freevar(e) then OpenFn(x,e,statesize e) - else Closure(x,e,env) -| App(ef,ea) -> - let va = eval stage ea env in - let vf = eval stage ef env in - match vf with - | OpenFn(x,e,size)-> let r = eval stage e ((x,va)::env) in - shift stateptr size; - r - | Closure(x,e,cenv) -> eval stage e ((x,va)::cenv) -| Delay(n,et,ev) -> - let v = eval stage ev env in - let vt = eval stage et env in - update_ringbuf state stateptr v vt -| Feed(x,e)-> - let size = statesize e in - let last = getstate state stateptr in - let current = eval stage e ((x,last)::env) - state[stateptr] := current; - last -| Quote(e)-> - rebuild stage+1 e env -| Splice(e)-> - let v = rebuild stage-1 e env - match v with - | Code(e) -> eval e env - _-> raise -and rebuild : stage -> expr -> env = -fun stage e env -> - if stage == 0 then eval e env - else Code(e) - - -``` - -mimiumã§ã¯ã€ - -グローãƒãƒ«ãªé–¢æ•°å‘¼ã³å‡ºã—ã¨ãれ以外ã®å‘¼ã³å‡ºã—ã®åŒºåˆ¥ã€‚å¼ã«è‡ªç”±å¤‰æ•°ãŒã‚ã‚‹ã‹ãªã„ã‹ã‚’区別ã™ã‚‹å¿…è¦ãŒã‚る。ãれを表示的æ„味論ã«è½ã¨ã—è¾¼ã‚ã‚‹ã®ã‹ - -グローãƒãƒ«ãªãƒ©ãƒ™ãƒ«é›†åˆã‚’定義ã—ã¦ã€ã‚°ãƒ­ãƒ¼ãƒãƒ«ãƒ©ãƒ™ãƒ«ã«åŸºã¥ã関数呼ã³å‡ºã—ã€ãƒ©ãƒ ãƒ€é …ã‹ã‚‰ç›´æŽ¥ã®å‘¼ã³å‡ºã— - - -### シンタックスシュガー +#### シンタックスシュガー mimiumã§ã¯ã€å¤šæ®µéšŽè¨ˆç®—ã®ä½“ç³»ã‚’ç›´æ„Ÿçš„ã«æ‰±ãˆã‚‹ã‚ˆã†ã«2ã¤ã®ã‚·ãƒ³ã‚¿ãƒƒã‚¯ã‚¹ã‚·ãƒ¥ã‚¬ãƒ¼ã‚’å°Žå…¥ã—ã¦ã„る。 @@ -171,8 +120,11 @@ mimiumã§ã¯ã€å¤šæ®µéšŽè¨ˆç®—ã®ä½“ç³»ã‚’ç›´æ„Ÿçš„ã«æ‰±ãˆã‚‹ã‚ˆã†ã«2ã¤ã® ### 多段階計算ã«ã‚ˆã‚‹ãƒ¡ã‚¿æ“作ã®å®Ÿä¾‹ -```rust +以下ã€å®Ÿéš›ã®mimiumã®ã‚³ãƒ¼ãƒ‰ã‚’用ã„ã¦å®Ÿä¾‹ã‚’解説ã™ã‚‹ã€‚以下ã§è¦‹ã›ã‚‹ã‚³ãƒ¼ãƒ‰ã¯ã„ãšã‚Œã‚‚mimiumã§å®Ÿéš›ã«å‹•作ã™ã‚‹ã€ãƒ‘ラメトリックãªåŠ ç®—åˆæˆã‚·ãƒ³ã‚»ã‚µã‚¤ã‚¶ãƒ¼ã®ã‚³ãƒ¼ãƒ‰ã§ã‚る。 +ã¾ãšã€Code.1ã¯å¤šæ®µéšŽè¨ˆç®—を使ã‚ãšã«ã€å†å¸°é–¢æ•°ã§ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã‚’生æˆã™ã‚‹ä¾‹ã§ã‚る。ã“ã®ä¾‹ã§ã¯ã€ã‚³ãƒ¼ãƒ‰ã¯ä¸€åº¦ã‚³ãƒ³ãƒ‘イルã•れã€ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã§ã‚°ãƒ­ãƒ¼ãƒãƒ«ç’°å¢ƒãŒè©•価ã•れるタイミングã§additive関数ãŒå®Ÿè¡Œã•れã€myoscã«ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ãŒæŸç¸›ã•れる。ã“ã®æ™‚ã€osc関数ã®å†…部状態ã¯ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã®ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ä¸Šã«ãれãžã‚Œç¢ºä¿ã•れる。 + +```rust fn additive(n,gen){ let g = gen() if (n>1){ @@ -182,9 +134,15 @@ fn additive(n,gen){ |rate| g(rate) } } -... -fn osc(){ - ... +let PI = 3.14159265359 +fn phasor_shift (freq,phase_shift){ + (self + freq/samplerate + phase_shift)%1.0 +} +fn sinwave = (freq,phase){ + phasor_shift(freq,phase)*2.0*PI |> sin +} +fn osc = (freq){ + sinwave(freq,0.0) * 0.5 } let myosc = additive(5, | | osc); fn dsp(){ @@ -194,6 +152,8 @@ fn dsp(){ } ``` +次ã«ã€Code.2ãŒã€å¤šæ®µéšŽè¨ˆç®—を用ã„ãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚る。ã“ã®ã‚³ãƒ¼ãƒ‰ã¯ã€ã‚·ãƒ³ã‚¿ãƒƒã‚¯ã‚¹ã‚·ãƒ¥ã‚¬ãƒ¼ã‚’外ã—ã¦ç´”粋ãªã‚¯ã‚ªãƒ¼ãƒˆã¨ã‚¹ãƒ—ライスをãƒã‚¹ãƒˆã—ãŸè¡¨ç¾ã«ç›´ã™ã¨Code.3ã®ã‚ˆã†ã«å±•é–‹ã•れる。ã“ã“ã§ã€additive関数ã¯ãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰ç”Ÿæˆã®å‰ã®æ®µéšŽã§ã€ã‚¹ãƒ†ãƒ¼ã‚¸0ã§è©•価ã•れCode.4ã®ã‚ˆã†ã«å±•é–‹ã•れる。 + ```rust #stage(macro) fn additive(n,gen){ @@ -207,14 +167,9 @@ fn additive(n,gen){ } #stage(main) let PI = 3.14159265359 -fn phasor_shift (freq,phase_shift){ - (self + freq/samplerate + phase_shift)%1.0 -} -fn sinwave = (freq,phase){ - phasor_shift(freq,phase)*2.0*PI |> sin -} +... fn osc = (freq){ - sinwave(freq,0.0) * 0.5 + ...//as same as non-macro version } fn dsp(){ let f = 200 @@ -223,7 +178,6 @@ fn dsp(){ } ``` - ```rust `{ // after desugar ${ @@ -250,11 +204,13 @@ fn dsp(){ } ``` +ステージ1ã§å®šç¾©ã•れã¦ã„ã‚‹osc関数ã¯ã€ã‚¹ãƒ†ãƒ¼ã‚¸0ã§additive関数ã®å®Ÿè¡Œã‚’通ã˜ã¦dsp関数ã®ä¸­ã«åŸ‹ã‚è¾¼ã¾ã‚Œã‚‹ã€‚ã“ã“ã§ã€å¤‰æ•°nã¯å…ƒã€…ステージ0ã§è©•価ã•れる変数ã®ãŸã‚ã€lift_fプリミティブ関数を用ã„ã¦ã‚¹ãƒ†ãƒ¼ã‚¸1ã¸æŒã¡è¶Šã•れã¦ã„る。 + ```rust // after macro expansion let osc = | | { ... - } +} let dsp = | |{ let f = 200 let r = f |> |f| osc(f*5)/5 + osc(f*4)/4 + ... osc(f) @@ -262,6 +218,8 @@ let dsp = | |{ } ``` +マクロãŒå±•é–‹ã•ã‚ŒãŸæ™‚点ã§ã€è‡ªç”±å¤‰æ•°ã‚’キャプãƒãƒ£ã™ã‚‹ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã¯ã‚³ãƒ¼ãƒ‰ã‹ã‚‰æ¶ˆãˆã¦ã„ã‚‹ã“ã¨ãŒã‚ã‹ã‚‹ã€‚実行時ã«ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ç”Ÿæˆã•れãªã„ãŸã‚ã€å†…部状態ストレージã¯ã‚°ãƒ­ãƒ¼ãƒãƒ«ç’°å¢ƒã«å˜ãªã‚‹é…列ã¨ã—ã¦ã‚¢ãƒ­ã‚±ãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚‹ã€‚ + ## コールツリーã®è§£æž ```rust @@ -271,7 +229,7 @@ enum StateTree{ Feed(WordSize), Mem(WordSize), Delay(MaxTime), - DirectFnCall(Vec) + OpenFnCall(Vec) } ``` @@ -321,7 +279,6 @@ fn osc(freq){ - phasor(freq)* 2 * PI |> sin + phasor(freq+(phasor(freq/10))) * 2 * PI |> sin } - ``` @@ -388,12 +345,11 @@ fn dsp(){//dspã¯Fncall[Fncall[FnCall[Feed]],Fncall[Feed]]ã§å¤‰åŒ–ãªã— 上ã®ã‚µãƒ³ãƒ—ルã§ã¯ã€ã¯ã˜ã‚lfoを使ã£ã¦å‘¨æ³¢æ•°ã‚’モジュレーションã—ã¦ã„る状態ã‹ã‚‰ã€å‘¨æ³¢æ•°ã¯å›ºå®šã«ã—ã¦éŸ³é‡ã‚’モジュレーションã™ã‚‹å‡¦ç†ã¸ã¨åˆ‡ã‚Šæ›¿ãˆãŸä¾‹ã§ã‚る。myfreq()ã¨myamp()ã¯ãれãžã‚Œã©ã¡ã‚‰ã‚‚osc関数を1度ã ã‘呼ã³å‡ºã™ãŸã‚ã€dsp関数ã®å†…éƒ¨çŠ¶æ…‹ãƒ„ãƒªãƒ¼ã®æ§‹æˆã¯å…±é€šã—ã¦ãŠã‚Šã€å†ã‚³ãƒ³ãƒ‘イル時ã«ãƒ‡ãƒ¼ã‚¿ãŒå¼•ãç¶™ãŒã‚Œã‚‹ã€‚ ã“ã®æ™‚ã€myampã«ã¯myfreqã®æœ€å¾Œã®ä½ç›¸ãŒå¼•ãç¶™ãŒã‚Œã‚‹ã“ã¨ã«ãªã‚‹ãŒã€ä»Šå›žå®Ÿè£…ã—ã¦ã„ã‚‹phasor1ã¯selfã«ä¿å­˜ã•れる値ãŒ0~samplerate/freqã€ä¾‹ãˆã°1000Hzãªã‚‰0~48ã®å€¤ã®ãƒ¬ãƒ³ã‚¸ã‚’å–りã€ã“れãŒmyampã®ä¸­ã§ä½¿ã‚れã¦ã„ã‚‹phasor2ã®selfã®ãã®å€¤ã®æœ¬æ¥ã®ãƒ¬ãƒ³ã‚¸ã¯0~1ã§ã‚ã‚‹ã¹ãã«ã‚‚é–¢ã‚らãšå¼•ãç¶™ãŒã‚Œã¦ã—ã¾ã†ã€‚ -ãŸã ã€çµå±€phasor2を実行ã—ãŸã¨ãã«ã¯0~1ã®ãƒ¬ãƒ³ã‚¸ã«ä¸¸ã¾ã‚‹ã®ã§å¤§ããªå•題ã«ã¯ãªã‚‰ãªã„。ã‚る関数ãŒã‚る範囲ã«åŽã¾ã‚‹ã“ã¨ãŒä¿è¨¼ã•れã¦ã„ã‚‹ã¨ã„ã†ã“ã¨ã¯ã€ä»®ã«ãã“ã§ä½¿ã‚れã¦ã„ã‚‹selfã«ä¸æ­£ãªå€¤ãŒå·®ã—è¾¼ã¾ã‚ŒãŸã¨ã—ã¦ã‚‚ã€ãã®é–¢æ•°ãŒè¨ˆç®—ã—終ã‚ã£ãŸã¨ãã«ã¯å…ƒã®ç¯„囲ã«åŽã¾ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã‹ã‚‰ã ã€‚ +ãŸã ã€çµå±€phasor2を実行ã—ãŸã¨ãã«ã¯0~1ã®ãƒ¬ãƒ³ã‚¸ã«ä¸¸ã¾ã‚‹ã®ã§å¤§ããªå•題ã«ã¯ãªã‚‰ãªã„。ã‚る関数ãŒã‚る範囲ã«åŽã¾ã‚‹ã“ã¨ãŒä¿è¨¼ã•れã¦ã„ã‚‹ã¨ã„ã†ã“ã¨ã¯ã€ä»®ã«ãã“ã§ä½¿ã‚れã¦ã„ã‚‹selfã«ä¸æ­£ãªå€¤ãŒå·®ã—è¾¼ã¾ã‚ŒãŸã¨ã—ã¦ã‚‚ã€ãã®é–¢æ•°ãŒè¨ˆç®—ã—終ã‚ã£ãŸã¨ãã«ã¯å…ƒã®ç¯„囲ã«åŽã¾ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã‹ã‚‰ã ã€‚ã¾ãŸé–¢é€£æ€§ã®ãªã„データãŒå·®ã—è¾¼ã¾ã‚ŒãŸã¨ã—ã¦ã‚‚ã€çµå±€ã¯è´æ„Ÿä¸Šé•和感ãŒãªã„程度ã«ç•™ã¾ã‚‹å¯èƒ½æ€§ã‚‚ã‚る。 +ã•らã«ã€å®Ÿéš›ã«ã¯ã‚³ãƒ¼ãƒ‰ã®è¦æ¨¡ãŒå¤§ãããªã£ã¦ã„ãã«ã¤ã‚Œã¦ã€é–¢æ•°å‘¼ã³å‡ºã—ã®æ·±ã•ãŒæ·±ããªã£ã¦ã„ããŸã‚ã€å¶ç„¶é–¢æ•°å‘¼ã³å‡ºã—ã®æ§‹é€ ãŒä¸€è‡´ã™ã‚‹å¯èƒ½æ€§ã¯å°ã•ããªã£ã¦ã„ãã“ã¨ã¨ã€å®Ÿéš›ã®ãƒ©ã‚¤ãƒ–コーディングã«ãŠã„ã¦ã¯ -ツリー構築ã®éš›ã«ã€FnCallã¯ãƒ’ントã¨ã—ã¦é–¢æ•°ã®ãƒ©ãƒ™ãƒ«ã‚’å—ã‘å–るよã†ãªå¤‰æ›´ãŒè€ƒãˆã‚‰ã‚Œã‚‹ã€‚ç„¡å関数ã¯ãƒ’ントãªã—ã§é ‘張る。 - ## å°†æ¥çš„ãªå±•望