From 233050d1fb920fcb065ea18dc9854d803397b749 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 16:28:14 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-12-19 16:28:14[ --- ...ƒ†ã‚£ãƒ–プログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md b/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md index f5cf50c3..1b994a58 100644 --- a/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md +++ b/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md @@ -97,18 +97,64 @@ $$ \begin{align} v ::= |&\quad R & R \in \mathbb{R} [number]&\\ - |&\quad cls(e,E) &[closure]&\\ + |&\quad openFn(x,e,statesize) &[closure]&\\ + |&\quad closure(x,e,E) &[closure]&\\ |&\quad \langle e \rangle &[code]&\\ \end{align} $$ -delay,mem,feedã¯ä¿¡å·å‡¦ç†ç”¨ã®ãƒ—リミティブã§ã‚る。mem(e)ã¯ã‚·ãƒ³ã‚°ãƒ«ã‚µãƒ³ãƒ—ルã®ãƒ‡ã‚£ãƒ¬ã‚¤ã ãŒã€ã“れã¯é…延時間ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒãªã„ãŸã‚通常ã®ãƒ‡ã‚£ãƒ¬ã‚¤ã¨åŒºåˆ¥ã—ã¦ä½¿ç”¨ã•れる。ã“れら3ã¤ã®ãƒ—リミティブã¯ã‚¹ãƒ†ãƒ¼ã‚¸1ã«æŸç¸›ã•れãŸçµ„ã¿è¾¼ã¿é–¢æ•°ã®ã‚ˆã†ã«æ‰±ã‚れã€ã‚¹ãƒ†ãƒ¼ã‚¸ï¼è©•価ã§ç¾ã‚Œã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã€‚ +delay,mem,feedã¯ä¿¡å·å‡¦ç†ç”¨ã®ãƒ—リミティブã§ã‚る。mem(e)ã¯ã‚·ãƒ³ã‚°ãƒ«ã‚µãƒ³ãƒ—ルã®ãƒ‡ã‚£ãƒ¬ã‚¤ã ãŒã€ã“れã¯é…延時間ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒãªã„ãŸã‚通常ã®ãƒ‡ã‚£ãƒ¬ã‚¤ã¨åŒºåˆ¥ã—ã¦ä½¿ç”¨ã•れる。ã“れら3ã¤ã®ãƒ—リミティブã¯ã‚¹ãƒ†ãƒ¼ã‚¸1ã«æŸç¸›ã•れãŸçµ„ã¿è¾¼ã¿é–¢æ•°ã®ã‚ˆã†ã«æ‰±ã‚れã€ã‚¹ãƒ†ãƒ¼ã‚¸0評価ã§ç¾ã‚Œã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã€‚ ã¾ãŸã€å¤šæ®µéšŽè¨ˆç®—ã«ãŠã„ã¦é‡è¦ãªã€`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ã§ã¯ã€ グローãƒãƒ«ãªé–¢æ•°å‘¼ã³å‡ºã—ã¨ãれ以外ã®å‘¼ã³å‡ºã—ã®åŒºåˆ¥ã€‚å¼ã«è‡ªç”±å¤‰æ•°ãŒã‚ã‚‹ã‹ãªã„ã‹ã‚’区別ã™ã‚‹å¿…è¦ãŒã‚る。ãれを表示的æ„味論ã«è½ã¨ã—è¾¼ã‚ã‚‹ã®ã‹