From 7badf982ca6706fcf1335b79db4836a679891ecf 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: Thu, 18 Dec 2025 16:11:13 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-12-18 16:11:13[ --- ...ƒ†ã‚£ãƒ–プログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md | 78 ++++++++++--------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md b/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md index b65e9b94..55c39a78 100644 --- a/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md +++ b/content/多段階計算ã¨å¢—分関数型リアクティブプログラミングã«ã‚ˆã‚‹ä¿¡å·å‡¦ç†ã®ãƒ©ã‚¤ãƒ–コーディング.md @@ -20,7 +20,7 @@ date: 2025-09-25 11:42 既存ã®ä¿¡å·å‡¦ç†ã‚’ターゲットã«ã—ãŸéŸ³æ¥½ãƒ—ログラミング言語ã«ãŠã‘ã‚‹å•題ã®ä¸€ã¤ã¨ã—ã¦ã€ã‚³ãƒ¼ãƒ‰ã®å¤‰æ›´æ™‚ã«ä¿¡å·å‡¦ç†ã®å†…部状態ãŒãƒªã‚»ãƒƒãƒˆã•れるå•題ãŒã‚る。ディレイやフィルターã¯ã€å†…部状態(メモリ)ã¸ã®ç¶™ç¶šçš„ãªæ›¸ãè¾¼ã¿ã¨èª­ã¿è¾¼ã¿ã‚’行ã†ã“ã¨ã§å‡¦ç†ã‚’実ç¾ã—ã¦ã„ã‚‹ãŒã€ãã®å†…部状態ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ã‚³ãƒ¼ãƒ‰ã®ã‚³ãƒ³ãƒ‘イル後ã€ä¿¡å·å‡¦ç†ã‚’実際ã«å§‹ã‚ã‚‹å‰ã«0埋ã‚ã§åˆæœŸåŒ–ã•れるã“ã¨ãŒä¸€èˆ¬çš„ã§ã‚る。 -Max(MSP)[@Max]ã‚„PureData[@puckette_pure_1997]ã€SuperCollider[@McCartney2002]ã®JITLibã«ãŠã‘ã‚‹ä¿¡å·å‡¦ç†ã®ã‚ˆã†ã«ã€ä¿¡å·å‡¦ç†ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ã‚°ãƒ©ãƒ•æ§‹æˆè‡ªä½“を実行中ã«å¤‰æ›´ã§ãるよã†ãªä»•組ã¿ã®å ´åˆã€å†…部状態ã¯ã‚­ãƒ¼ãƒ—ã•れる。TidaiCycles[@McLean2014]ã‚„Sonic Pi[@Aaron2013]ã®ã‚ˆã†ãªSuperColliderã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã—ã¦å®Ÿè£…ã•ã‚Œã‚‹è¨€èªžã‚‚åŒæ§˜ã§ã‚る一方ã€ä¿¡å·å‡¦ç†ã‚’使ã£ãŸè¡¨ç¾ã®å¹…ã¯SuperColliderã®ãƒ—リミティブã¨ã—ã¦ç”¨æ„ã•れãŸUnit Generatorã®çµ„ã¿åˆã‚ã›ã«ç•™ã¾ã‚‹ã“ã¨ã«ãªã‚‹ã€‚ +SuperCollider[@McCartney2002]ã®JITLibã«ãŠã‘ã‚‹ä¿¡å·å‡¦ç†ã®ã‚ˆã†ã«ã€ä¿¡å·å‡¦ç†ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ã‚°ãƒ©ãƒ•æ§‹æˆè‡ªä½“を実行中ã«å¤‰æ›´ã§ãるよã†ãªä»•組ã¿ã®å ´åˆã€å†…部状態ã¯ã‚­ãƒ¼ãƒ—ã•れる。TidaiCycles[@McLean2014]ã‚„Sonic Pi[@Aaron2013]ã®ã‚ˆã†ãªSuperColliderã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã—ã¦å®Ÿè£…ã•ã‚Œã‚‹è¨€èªžã‚‚åŒæ§˜ã§ã‚る一方ã€ä¿¡å·å‡¦ç†ã‚’使ã£ãŸè¡¨ç¾ã®å¹…ã¯SuperColliderã®ãƒ—リミティブã¨ã—ã¦ç”¨æ„ã•れãŸUnit Generatorã®çµ„ã¿åˆã‚ã›ã«ç•™ã¾ã‚‹ã“ã¨ã«ãªã‚‹ã€‚ Faust[@Orlarey2009]ã‚„Maxã®Genã€ã®ã‚ˆã†ã«ã€ã‚µãƒ³ãƒ—ルå˜ä½ãƒ¬ãƒ™ãƒ«ã§ã®ä¿¡å·å‡¦ç†ã®è¨˜è¿°ãŒã§ãるプログラミング言語ã®å ´åˆã¯ã€ã‚³ãƒ¼ãƒ‰ã‚’一度低レベルãªå‘½ä»¤ï¼ˆFaustã§ã‚れã°LLVM IRãªã©ï¼‰ã«å¤‰æ›ã—ã€ãã®ã‚³ãƒ¼ãƒ‰ã‚’インスタンス化ã—ã¦ã‹ã‚‰å®Ÿè¡Œã™ã‚‹ãŸã‚ã«ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§æ¯Žå›žå†…部状態ã¯ãƒªã‚»ãƒƒãƒˆã•れる。 @@ -30,13 +30,11 @@ Faust[@Orlarey2009]ã‚„Maxã®Genã€ã®ã‚ˆã†ã«ã€ã‚µãƒ³ãƒ—ルå˜ä½ãƒ¬ãƒ™ãƒ«ã§ ã“ã†ã—ãŸèª²é¡Œã«å¯¾ã—ã€Reachã¯é–¢æ•°åž‹ã®Unit Generatorを組ã¿åˆã‚ã›ã¦ä¿¡å·å‡¦ç†ã‚’記述ã™ã‚‹è¨€èªžã§ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®å¤‰æ›´å·®åˆ†ã‚’è§£æžã—ã¦ä¿¡å·å‡¦ç†ã®å†…部状態をå¯èƒ½ãªé™ã‚Šä¿æŒã™ã‚‹ä»•組ã¿:**Incremental Functional Reactive Programming**(以下本稿ã§ã¯IcFRPã¨å‘¼ã¶)ã‚’ææ¡ˆã—ã¦ã„ã‚‹[@reach_incremental_2013]。ã“ã®ä»•組ã¿ã¯ã€SuperColliderã®JITLibã®ã‚ˆã†ãªã‚·ã‚¹ãƒ†ãƒ ã¨æ¯”ã¹ã‚‹ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒç¾åœ¨ã®ä¿¡å·å‡¦ç†ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«å¯¾ã—ã¦å‰Šé™¤ã‚„追加ãªã©ã®å‘½ä»¤ã‚’行ã†ã®ã§ã¯ãªãã€å¸¸ã«ãã®æ™‚ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã«æœ›ã‚€ä¿¡å·å‡¦ç†ã‚’書ã‘ã°å¿…è¦ãªçŠ¶æ…‹ã®æ›´æ–°ã¯ãƒ©ãƒ³ã‚¿ã‚¤ãƒ å´ãŒè‡ªå‹•ã§æ‹…ã£ã¦ãれるã¨ã„ã†ç‚¹ã§ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ¼”å¥ä¸­ã®æ€è€ƒãƒ¢ãƒ‡ãƒ«ãŒå¤§ããç•°ãªã‚‹ã¨è¨€ãˆã‚‹ã€‚ -ãŸã ã€Reachã«ã‚ˆã‚‹å®Ÿè£…ã¨ã—ã¦ã¯ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®å˜ãªã‚‹ãƒ†ã‚­ã‚¹ãƒˆå·®åˆ†ã®è§£æžã§ã¯ã€è¤‡æ•°ã®å¤‰æ›´ã®ãƒ‘ターンã®å¯èƒ½æ€§ã‚’絞り込ã‚ãªã„ãŸã‚ã€ãƒ†ã‚­ã‚¹ãƒˆã‚¨ãƒ‡ã‚£ã‚¿Emacsã®æ‹¡å¼µæ©Ÿèƒ½ã¨ã—ã¦ã€åˆ‡ã‚Šå–りや貼り付ã‘ã¨ã„ã£ãŸæ“作ã®å±¥æ­´ã‚’å–å¾—ã™ã‚‹ã“ã¨ã§å®Ÿè£…ã—ã¦ã„る。 +ãŸã ã€Reachã«ã‚ˆã‚‹å®Ÿè£…ã¨ã—ã¦ã¯ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®å˜ãªã‚‹ãƒ†ã‚­ã‚¹ãƒˆå·®åˆ†ã®è§£æžã§ã¯ã€è¤‡æ•°ã®å¤‰æ›´ã®ãƒ‘ターンã®å¯èƒ½æ€§ã‚’絞り込ã‚ãªã„ãŸã‚ã€å„é …ã«éš ã‚ŒãŸãƒ©ãƒ™ãƒ«ã‚’ç´ã¥ã‘ãŸä¸Šã§ã€ãƒ†ã‚­ã‚¹ãƒˆã‚¨ãƒ‡ã‚£ã‚¿Emacsã®æ‹¡å¼µæ©Ÿèƒ½ã¨ã—ã¦ã€åˆ‡ã‚Šå–りや貼り付ã‘ã¨ã„ã£ãŸæ“作ã®å±¥æ­´ã‚’å–å¾—ã™ã‚‹ã“ã¨ã§å®Ÿè£…ã•れã¦ã„る。 本稿ã§ã¯ã€ç­†è€…ãŒé–‹ç™ºã—ã¦ããŸé–¢æ•°åž‹éŸ³æ¥½ãƒ—ログラミング言語mimiumã«ã€IcFRPã®è€ƒãˆæ–¹ã‚’応用ã—ã¤ã¤ã€å˜ç´”ãªãƒ†ã‚­ã‚¹ãƒˆæ¯”較ã®ã¿ã§å‹•作ã™ã‚‹ãƒ©ã‚¤ãƒ–ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã‚’ææ¡ˆã™ã‚‹ã€‚ -ä»¥ä¸‹ã€æœ¬è«–æ–‡ã¯mimiumã®ã“れã¾ã§ã®è¨€èªžè¨­è¨ˆã®ç°¡å˜ãªèª¬æ˜Žã¨ã€å°Žå…¥ã•れる2ç¨®é¡žã®æ©Ÿèƒ½æ‹¡å¼µã«ã¤ã„ã¦é †ç•ªã«èª¬æ˜Žã™ã‚‹ã€‚ - -ãã®å¾Œã€æœ¬ãƒ©ã‚¤ãƒ–コーディングシステムã®ä»–ã®ã‚·ã‚¹ãƒ†ãƒ ã¨æ¯”較ã—ãŸç‰¹å¾´ãŠã‚ˆã³å•題点を議論ã™ã‚‹ã€‚ +ä»¥ä¸‹ã€æœ¬è«–æ–‡ã¯mimiumã®ã“れã¾ã§ã®è¨€èªžè¨­è¨ˆã®ç°¡å˜ãªèª¬æ˜Žã¨ã€å°Žå…¥ã•れる2ç¨®é¡žã®æ©Ÿèƒ½æ‹¡å¼µã«ã¤ã„ã¦é †ç•ªã«èª¬æ˜Žã™ã‚‹ã€‚ãã®å¾Œã€æœ¬ãƒ©ã‚¤ãƒ–コーディングシステムã®ä»–ã®ã‚·ã‚¹ãƒ†ãƒ ã¨æ¯”較ã—ãŸç‰¹å¾´ãŠã‚ˆã³å•題点を議論ã™ã‚‹ã€‚ ## mimium and lambda-mmm @@ -45,11 +43,11 @@ mimiumã¯ã€Rustã«è¿‘ã„シンタックスをæŒã£ãŸé–¢æ•°åž‹ã®éŸ³æ¥½ä¿¡å· mimiumã¯ã‚³ãƒ¼ãƒ‰ã‚’専用ã®VMãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰ã¸ã‚³ãƒ³ãƒ‘イルã—実行ã™ã‚‹ã€‚実行モデルã¯ã€ä¸€èˆ¬çš„ãªãƒ¬ã‚¸ã‚¹ã‚¿ãƒžã‚·ãƒ³ã®å‘½ä»¤ã‚»ãƒƒãƒˆã«ã€å†…部状態æ“ä½œç”¨ã®æ“作ãŒåŠ ã‚ã£ãŸã‚‚ã®ã¨ãªã‚‹ã€‚ディレイやフィードãƒãƒƒã‚¯ã§ç”¨ã„られる内部状態ã¯ã€çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã¨ã„ã†1次元ã®é…列領域ã¨å˜ä¸€ã®èª­ã¿å‡ºã—ä½ç½®ãƒã‚¤ãƒ³ã‚¿ã‚’組ã¿åˆã‚ã›ãŸãƒ‡ãƒ¼ã‚¿é ˜åŸŸã«ä¿å­˜ã•れる。 -コンパイラã¯ã€çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®èª­ã¿å‡ºã—ä½ç½®ãƒã‚¤ãƒ³ã‚¿ã‚’相対的ã«å‰å¾Œã•ã›ã‚‹å‘½ä»¤ã‚’é©åˆ‡ã«å‡ºåŠ›ã™ã‚‹ã“ã¨ã§ã€VM実行時ã«ã¯ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ä¸€éƒ¨åˆ†ã‚’フィードãƒãƒƒã‚¯ã®çŠ¶æ…‹å¤‰æ•°ã‚„ãƒ‡ã‚£ãƒ¬ã‚¤ç”¨ã®ãƒªãƒ³ã‚°ãƒãƒƒãƒ•ã‚¡ã¨ã—ã¦è§£é‡ˆã—ãƒ‡ãƒ¼ã‚¿ã‚’èª­ã¿æ›¸ãã™ã‚‹ã€‚ +コンパイラã¯ã€çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®èª­ã¿å‡ºã—ä½ç½®ãƒã‚¤ãƒ³ã‚¿ã‚’相対的ã«å‰å¾Œã•ã›ã‚‹å‘½ä»¤ã‚’é©åˆ‡ã«å‡ºåŠ›ã™ã‚‹ã“ã¨ã§ã€VM実行時ã«ã¯ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ç‰¹å®šé ˜åŸŸã‚’フィードãƒãƒƒã‚¯ã®çŠ¶æ…‹å¤‰æ•°ã‚„ãƒ‡ã‚£ãƒ¬ã‚¤ç”¨ã®ãƒªãƒ³ã‚°ãƒãƒƒãƒ•ã‚¡ã¨ã—ã¦è§£é‡ˆã—ãƒ‡ãƒ¼ã‚¿ã‚’èª­ã¿æ›¸ãã™ã‚‹ã€‚ -éŽåŽ»ã®mimiumã§ã¯é«˜éšŽé–¢æ•°ãªã©ã‚’使ã†ã“ã¨ã«ã‚ˆã£ã¦ä»»æ„ã®æ•°ã®ãƒ•ィルタãƒãƒ³ã‚¯ã®ã‚ˆã†ãªã€ãƒ‘ラメトリックãªãƒ—ロセッサを生æˆã™ã‚‹ã“ã¨ã‚‚ã§ããŸãŒã€ã“ã†ã—ãŸãƒ—ロセッサã¯çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºã‚’決定ã§ããªã‹ã£ãŸã€‚ãã®ãŸã‚ã€ã‚°ãƒ­ãƒ¼ãƒãƒ«ãªé–¢æ•°ã®å‘¼ã³å‡ºã—ã¨ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ï¼ˆå®Ÿè¡Œæ™‚ã«é«˜éšŽé–¢æ•°ã‹ã‚‰ç”Ÿæˆã•れる関数)ã®å‘¼ã³å‡ºã—ã¯åŒºåˆ¥ã•れã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«å€‹åˆ¥ã®çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’ç”Ÿæˆã—ã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£å‘¼ã³å‡ºã—時ã«ä½¿ç”¨ã™ã‚‹çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãã®ã‚‚ã®ã‚’切り替ãˆã‚‹ã“ã¨ã§å¯¾å¿œã—ã¦ã„ãŸã€‚ +éŽåŽ»ã®mimiumã§ã¯é«˜éšŽé–¢æ•°ãªã©ã‚’使ã†ã“ã¨ã«ã‚ˆã£ã¦ä»»æ„ã®æ•°ã®ãƒ•ィルタãƒãƒ³ã‚¯ã®ã‚ˆã†ãªã€ãƒ‘ラメトリックãªãƒ—ロセッサを生æˆã™ã‚‹ã“ã¨ã‚‚ã§ããŸãŒã€ã“ã†ã—ãŸãƒ—ロセッサã¯çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºã‚’ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«æ™‚ã«æ±ºå®šã§ããªã‹ã£ãŸã€‚ãã®ãŸã‚ã€ã‚°ãƒ­ãƒ¼ãƒãƒ«ãªé–¢æ•°ã®å‘¼ã³å‡ºã—ã¨ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ï¼ˆå®Ÿè¡Œæ™‚ã«é«˜éšŽé–¢æ•°ã‹ã‚‰ç”Ÿæˆã•れる関数)ã®å‘¼ã³å‡ºã—ã¯åŒºåˆ¥ã•れã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«å€‹åˆ¥ã®çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’ç”Ÿæˆã—ã€ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£å‘¼ã³å‡ºã—時ã«ä½¿ç”¨ã™ã‚‹çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãã®ã‚‚ã®ã‚’切り替ãˆã‚‹ã“ã¨ã§å¯¾å¿œã—ã¦ã„ãŸã€‚ -ä»Šå›žææ¡ˆã™ã‚‹ãƒ©ã‚¤ãƒ–コーディング機能ã¯ã€2ã¤ã®æ©Ÿèƒ½ã«ã‚ˆã£ã¦å®Ÿç¾ã•れる。 +ä»Šå›žææ¡ˆã™ã‚‹ãƒ©ã‚¤ãƒ–コーディング機能ã¯ã€2ã¤ã®æ©Ÿèƒ½è¿½åŠ ã«ã‚ˆã£ã¦å®Ÿç¾ã•れる。 1ã¤ã¯ã€çŠ¶æ…‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’コンパイル時ã«å¯èƒ½ãªé™ã‚Šç¢ºå®šã•ã›ã‚‹ãŸã‚ã«ã€å¤šæ®µéšŽè¨ˆç®—ã¨ã„ã†åž‹å®‰å…¨ãªãƒžã‚¯ãƒ­ã®ä½“系を言語ã«å°Žå…¥ã™ã‚‹ã“ã¨ã§ã‚る。 @@ -59,7 +57,7 @@ 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}$)ã®ã‚·ãƒ³ã‚¿ãƒƒã‚¯ã‚¹ã‚’定義ã™ã‚‹ã€‚ @@ -128,20 +126,21 @@ mimiumã§ã¯ã€å¤šæ®µéšŽè¨ˆç®—ã®ä½“ç³»ã‚’ç›´æ„Ÿçš„ã«æ‰±ãˆã‚‹ã‚ˆã†ã«2ã¤ã® ### 多段階計算ã«ã‚ˆã‚‹ãƒ¡ã‚¿æ“作ã®å®Ÿä¾‹ ```rust -fn cascade(n,gen){ +... +fn osc(){ + ... +} +fn additive(n,gen){ let g = gen() - if (n>0){ - let c = cascade(n - 1.0 ,gen) - let multiplier = 1.0-(1.0/(n*2.0)) - |rate| { rate + g(rate/2.0)* 0.5 * rate * multiplier |> c } + if (n>1){ + let c = additive(n - 1.0 ,gen) + |rate| c(rate) + g(rate)/n }else{ |rate| g(rate) } } -fn osc(){ - ... -} -let myosc = cascade(20, | | osc); + +let myosc = additive(5, | | osc); fn dsp(){ let f = 200 let r = f |> myosc @@ -150,38 +149,45 @@ fn dsp(){ ``` ```rust +#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 +} #stage(macro) -fn cascade(n,gen){ - if (n>0.0){ - let multiplier = 1.0-(1.0/(n*3)) |> lift_f - `|rate| rate + ($gen)(rate/3)* rate* $multiplier - |> $cascade(n - 1.0 ,gen) +fn additive(n,gen:`(float)->float)->`(float)->float{ + if (n>1){ + let multiplier = lift_f(n) + let next = additive(n - 1.0 ,gen) + `|rate|{ ($gen)(rate*$multiplier) / $multiplier + ($next)(rate)} }else{ `|rate| ($gen)(rate) } } #stage(main) -fn osc(){ - ... -} fn dsp(){ - let f = 200 - let r = f |> cascade!(20,`osc) + let f = 1000 + let r = f |> additive!(10,`osc) |> Probe!("test") (r,r) } ``` ```rust -`{ +`{ // after desugar ${ - 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) } + let additive = |n,gen|{ + if (n>1){ + let divider = lift_f(n) + `|rate| ($gen)(rate) / $divider + $additive(n - 1.0 ,gen) }else{ - `{|rate| ($gen)(rate)} + `|rate| ($gen)(rate) } } `{ @@ -190,7 +196,7 @@ fn dsp(){ } let dsp = | |{ let f = 200 - let r = f |> $cascade(20,`osc) + let r = f |> $additive(5,`osc) (r,r) } }