éåæã¨ç¶ç¶ã¨ç§
éåæã®ããã°ã©ãã³ã°ã®è§£èª¬ã®ä¸ã«ã¯ãããç¶ç¶ï¼æ¸¡ãï¼ããè¯ãåºã¦ãã¾ããç¶ç¶ã¨ããã° Scheme ã® call/cc ã§ããããã£ã±ã JSDeferred ã®サンプルのページã«ãåºã¦ãã¾ããç´æçã«ã¯ããã¾ãé¢ä¿ãªããããªæ°ããã¾ãããé¢ä¿ãããããã§ãã
ããã«ãéåæã¨é 延è©ä¾¡ã®é¢ä¿ãæ°ã«ãªãã¾ããéåæã¯ãçµæãå¾ã§æ¥ããæãã§ãããé 延è©ä¾¡ã¯ãå¿ è¦ã«ãªãã¾ã§çµæãè¨ç®ããªããã¨ãããã¨ã§ãå¾åãã«ããæããä¼¼ã¦ãã¾ãã
ä»åãdeferred.el ãä½ã£ãå¾ã«ãããã«ã¤ãã¦èãã¦ã¿ãã¨ããããªãã¨ãªãèªåã®ä¸ã§å®ç¨çãªçµè«ã«éããã®ã§ã¾ã¨ãã¦ã¿ã¾ããã以ä¸ããã®éç¨ã¨ã¾ã¨ãã§ãã
ãããã
- ç¶ç¶æ¸¡ã(CPS)ã¨éåæ
- CPSå¤æããéåæå
- Deferredã§éåæå
- é
延è©ä¾¡ã¨éåæ
- é 延é¢æ°ã®CPSå¤æããéåæå
- Deferredã§éåæå
- æ示çå½¢å¼ã¨æé»çå½¢å¼
- ç¶ç¶ã¨Deferred
- éåæã®è¨è¨ã»ã¢ã¼ããã¯ãã£
- éåæã®ãããã¯ã»è©±é¡
è¨äºã®ä¸ã®å®å ¨ãªã½ã¼ã¹ã³ã¼ããã¡ã¢ã¯ gist ã«è²¼ã£ã¦ããã¾ããçç¥ããé¨åããã©ãã¼ããããå®éã«åããã¦ã¿ããæ¹ã¯åèã«ãã¦ã¿ã¦ãã ããã
ç¶ç¶æ¸¡ãå½¢å¼(CPS)ã¨éåæ
ã¾ãã¯ç¶ç¶æ¸¡ãå½¢å¼(Continuation Passing Style)ã¨éåæã¨ã®é¢ä¿ã§ããçµè«ããæ¸ãã¨ãDeferredã使ããã¨ã§éåæã®å¦çãCPSãããã·ã³ãã«ã«æãç´ããã¨ãåºæ¥ã¾ãã
å®éã«Emacs Lispã®ããã°ã©ã ãè¦ãªãã確èªãã¦ã¿ã¾ããé¡æã¯ã¿ããªå¤§å¥½ããã£ããããã§ãã
å ã®ããã°ã©ã ï¼åæçï¼
ã¾ãããã£ããããã®å®ç¾©ããç´ ç´ã«æ¸ããããã°ã©ã ã¯ä»¥ä¸ã®ããã§ãã
(defun fib (n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
ãã®ããã°ã©ã ã¯å®ç¾©éãã§ã·ã³ãã«ã§ãããå ¥åã®æ°ã大ãããªãã¨ãå帰ãç¸å½æ°çºçããããé常ã«é ãã§ããå®éã«ããã®ãããªããã°ã©ã ã¯ãã£ããããã大éã«è¨ç®ããç®çã§ã¯ãã¾ã使ããã¾ãããããã§ã¯ããå ¸åçãªé ãããã°ã©ã ãã¨ãã¦ãã®ããã°ã©ã ãå©ç¨ãã¦ããã¾ãã
ããã以ä¸ã®ãããªé¢æ°ã§è¨ç®ãã¦ãããã¡ã«åºåãã¾ãã
â»å®éã«é¢æ°ãè¨ç®ãã¦è¡¨ç¤ºããé¢æ°ã¯ãä»å¾ã¯çç¥ãã¾ãããã ããããã示ãé¢æ°ãã©ã®ããã«å¼ã³åºãã¦ä½¿ãã®ãã¨ããéè¦ãªæ å ±ãå ¥ã£ã¦ãã¾ãã®ã§ãèå³ãã人ã¯ãã§ãã¯ãã¦ã¿ã¦ãã ããã
;; å¼ã³åºãã¦è¡¨ç¤ºããé¢æ° (defun callfunc (upper func) (let ((buf (get-buffer-create "*callfunc*"))) (with-current-buffer buf (erase-buffer) (loop for i from 0 upto upper do (insert (format "%4d > %s\n" i (funcall func i))))) (pop-to-buffer buf)))
å®è¡ããã¨ä»¥ä¸ã®ããã«è¡¨ç¤ºããã¾ãã
(callfunc 30 'fib) ; å®è¡ 0 > 0 (0.000091 msec) 1 > 1 (0.000127 msec) 2 > 1 (0.000142 msec) 3 > 2 (0.000156 msec) 4 > 3 (0.000173 msec) 5 > 5 (0.000193 msec) 6 > 8 (0.000220 msec) 7 > 13 (0.000256 msec) 8 > 21 (0.000309 msec) 9 > 34 (0.000388 msec) : : 28 > 317811 (1.169075 msec) 29 > 514229 (1.890093 msec) 30 > 832040 (3.053179 msec)
å®è¡ãã¦ããéãEmacsã¯åºã¾ãã¾ããæå¾ã®è¨ç®çµæãè¨ç®ãçµãã£ã¦ããããã¹ã¦ã®çµæã表示ããã¾ãã
ãã®ããã«ãç°å¢ãåºã¾ããªãããã«ããããé
ãå¦çã¨ã©ãåãåã£ã¦ãããã¨ããã®ãä»åã®ãã¼ãã«ãªãã¾ãã
ç¶ç¶æ¸¡ãã§åæçã«å®è¡
ã¾ãæ£æ»æ³ã¯ãé ãå¦çãç´°åãã«ãã¦ããã¯ã°ã©ã¦ã³ãã§å°ãã¥ã¤å®è¡ããæ¹æ³ã§ããããããã°ãªã¼ã³ã¹ã¬ããã§ãããããããã¨ã§ãããããè£ã§å¹³è¡ãã¦å®è¡ãã¦ããããã«è¦ãããã¨ãåºæ¥ã¾ããï¼ãã¡ããã¡ããã¨ããã¹ã¬ããã使ããã°ããã¯ã°ã©ã¦ã³ãã§å¦çãèµ°ããããã¨ãåºæ¥ãã®ã§æ¥½ã§ããï¼
Emacs LispãJavaScriptã®ããã«ã·ã³ã°ã«ã¹ã¬ããã®ç°å¢ã§ã¯ãèªåã§å¦çãç´°åãã«ãã¦éåæã«å®è¡ããå¿ è¦ãããã¾ããå¦çã«ãã£ã¦ã¯æ°ããã¢ã«ã´ãªãºã ãèãã¦éåæåãããã¨ãåºæ¥ã¾ãããä»åã¯ç¶ç¶æ¸¡ãå¤æï¼CPSå¤æï¼ãã¤ãã£ã¦ããã¨ã®ããã°ã©ã ã®æ§é ãç¶æããã¾ã¾æ©æ¢°çã«éåæåããæ¹æ³ã§é²ãã¾ãã
CPSå¤æã¨ã¯ãç°¡åã«è¡¨ç¾ããã¨é¢æ°ã®çµæå¤ãã³ã¼ã«ããã¯ã§è¿ããã¨ã§ãã
ä¾ãã°ã以ä¸ã®ãããªè¶³ãç®ã®é¢æ°ããã£ãã¨ãã«ã
;;è¿å¤ã§çµæãè¿ã (defun add (a b) (+ a b)) (message "%s" (add 1 2)) ; => 3 ããããããã¡ã«è¡¨ç¤ºããã
CPSå¤æããã¦ä»¥ä¸ã®ããã«æ¸ãç´ããã¨ãåºæ¥ã¾ãã
;;CPS(ã³ã¼ã«ããã¯)ã§çµæãè¿ã (defun add (a b cc) (funcall cc (+ a b))) (add 1 2 (lambda (result) (message "%s" result))) ; => 3 ããããããã¡ã«è¡¨ç¤ºããã
ãã®ããã«ã³ã¼ã«ããã¯ã«ãã¦ãã¾ããã¨ã§ãå¾ç¶ã®å¦çãå¾ ãããã«å¥½ããªã¿ã¤ãã³ã°ã§çµæãè¿ããã¨ãåºæ¥ãããã«ãªãã¾ããç°¡åã«ã¤ã¡ã¼ã¸ãæ¸ãã¨ä¸ã®å³ã®ããã§ãã
ãã£ã¨è©³ããCPSå¤æã«ã¤ãã¦ã¯ä»¥ä¸ã®æ å ±ãåèã«ãªãã¾ãã
- Continuation-passing style (Wikipedia)
- 何でも継続 (practical-scheme)
- 継続渡し形式(CPS) (Javascriptããã°ã©ãã³ã° by unkaiãã)
ä»åã®ãã£ããããã®å ´åã¯ä»¥ä¸ã®ããã«å¤æã§ãã¾ãã
(defun fib-cb (n cc) ; å¼æ°ã«ã³ã¼ã«ããã¯é¢æ°ã渡ã (if (<= n 1) (funcall cc n) (lexical-let ((n n) (cc cc)) (fib-cb (- n 1) (lambda (x) ; ã³ã¼ã«ããã¯ï¼ã¤ç® (lexical-let ((x x)) (fib-cb (- n 2) (lambda (y) ; ã³ã¼ã«ããã¯ï¼ã¤ç® (funcall cc (+ x y)))))))))) ; ããã§ãã£ã¨è¨ç®
ãã®æç¹ã§ããè² ããããªã³ã¼ãã§ãã
å®è¡ãã¦ã¿ãã¨ããã£ã¨å¤§å¤ãªãã¨ã«ãã¹ã¿ãã¯ãªã¼ãã¼ããã¼ã§éä¸ã§å®è¡ãæ¢ã¾ãã¾ãã
(callfuncb 10 'fib-cb) 0 > 0 (0.000076 msec) 1 > 1 (0.000131 msec) 2 > 1 (0.000743 msec) 3 > 2 (0.002135 msec) 4 > 3 (0.004876 msec) 5 > 5 (0.009524 msec) 6 > 8 (0.015993 msec) 7 > 13 (0.024714 msec) ; -> 7ã¾ã§ã§ã¹ã¿ãã¯ãªã¼ãã¼ããã¼
åå ã¯é常ã®å帰ã«å ãã¦ãã³ã¼ã«ããã¯ï¼lambdaï¼ã®ã¹ã¿ãã¯ã追å ããã¦Emacs Lispã®éçã«éãã¦ããããã§ãã
ç¶ç¶æ¸¡ãããã®ã¾ã¾éåæã«å®è¡
å ã»ã©ã®CPSå¤æããããã°ã©ã ãããè¦ãã¨ãã³ã¼ã«ããã¯é¢æ°ã¯é¢æ°å ã®ã¬ãã·ã«ã«ã¹ã³ã¼ãã®å¤æ°ã ããã使ã£ã¦ãã¾ãããããã«ãã³ã¼ã«ããã¯ã®ä¸ã§è¨ç®ãè¡ãããã«ããã®ã§ãå¼ã³åºããé¢æ°ï¼fib-cbï¼ã®è¿å¤ã使ã£ã¦è¨ç®ãã¦ããã¨ãããããã¾ããã
ã¨ãããã¨ã§ãé¢æ°(fib-cb)ã®è¿å¤ã¯å¿ è¦ãªããããéåæã«å®è¡ãã¦ããã¾ããªãã¨ãããã¨ã«ãªãã¾ããã¨ãããã¨ã§ããããæ©æ¢°çã«éåæã«æ¸ãæãã¦ãã¾ãã¾ãã
(require 'deferred) ; éåæã®ä¾¿å©ãã¼ã« (defun fib-cbd (n cc) (if (<= n 1) (deferred:call cc n) ; éåæå (lexical-let ((n n) (cc cc)) (deferred:call 'fib-cbd (- n 1) ; éåæå (lambda (x) (lexical-let ((x x)) (deferred:call 'fib-cbd (- n 2) ; éåæå (lambda (y) (deferred:call cc (+ x y))))))))))
é¢æ°å¼ã³åºãã deferred:call ã«æ¸ãæãã¾ããããã㯠funcall ã¨åãå½¢ã§ä½¿ãããã®ã§ãéåæã§é¢æ°ãå¼ã³åºãã¾ããï¼å é¨ã§ã¯ elispçã«ã¯ run-at-time ãJavaScriptçã«ã¯ setTimeout ã®å½¢ã§å¼ã³åºãã¦ãããã¨ã«ãªã£ã¦ãã¾ããï¼
å®è¡ãã¦ã¿ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
(callfuncb 14 'fib-cbd) ; -> è¨ç®çµæãé 次表示ããã 1 > 1 (0.115368 msec) 2 > 1 (0.478819 msec) 3 > 2 (0.569296 msec) : : 10 > 55 (2.132786 msec) 11 > 89 (2.750348 msec) 12 > 144 (3.555442 msec) 13 > 233 (4.632972 msec) 14 > 377 (6.410187 msec)
è¨ç®çµæãï¼è¡ãã¤è¡¨ç¤ºãããããã«ã¯Emacsãï¼ãã¾ãï¼åºã¾ããªããªãã¾ããããã£ããããé¢æ°ã®éåæåã®å®æã§ãã
ãã ãåé¡ã¯CPSå¤æãèãããã¨ãé£ããã¨ãããã¨ã ã¨æãã¾ããã¾ããå ã®ããã°ã©ã ã¨æ¯è¼ãã¦ã¿ãã¨ããã¯ãè·¡å½¢ãããã¾ããã
;; å ã®é¢æ° (defun fib (n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) ;; CPSéåæã®é¢æ° (defun fib-cbd (n cc) (if (<= n 1) (deferred:call cc n) ; ccã£ã¦ä½ãå ¥ã£ã¦ãããã ã£ã? (lexical-let ((n n) (cc cc)) ; 2è¡ã®ã¯ãã7è¡ã«! (deferred:call 'fib-cbd (- n 1) (lambda (x) (lexical-let ((x x)) (deferred:call 'fib-cbd (- n 2) (lambda (y) (deferred:call cc (+ x y)))))))))) ; ã«ãã³ããã°ã!!!
ãããè¤éã«ãªã£ã¦ãã¾ã£ããããCPSå¤æã ãã§ãã£ã±ããã£ã±ãã§ãããã£ããããã§ãããªã£ã¦ãã¾ã£ããããã以ä¸é£ããããã°ã©ã ãéåæåãããã®ã¯å¤§å¤ããã§ãã
Deferredã§æ¸ãç´ã
ããã§Deferredã®ç»å ´ã§ããå ã®é¢æ°ã deferred.el ã使ã£ã¦ç´ ç´ã«æ¸ãã¦ã¿ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
(defun dfib (n) (lexical-let* ((n n)) (if (<= n 1) n ; ç´ ç´ã«å¤ãè¿ã (deferred:nextc (deferred:parallel (lambda () (dfib (- n 1))) ; å帰ã§å¼ã㧠(lambda () (dfib (- n 2)))) ; (lambda (vars) (apply '+ vars)))))) ; 足ãç®ãã
CPSããã¯æããªãæãã§ããä¸ããä¸ã«ãã£ã¨èªããããã«ãªã£ã¦ãã¾ãã
å¤ãè¿ãããlambdaãè¿ãããã¨ããnextcã¨ãparallelã¨ãåºã¦ãã¾ããããCPSã®è¤éãã«æ¯ã¹ãã°å¤§ãããã¨ããã¾ãããï¼ï¼
å®è¡ããã¨ãæå¾ éã以ä¸ã®ããã«ãªãã¾ãã
(callfuncd 14 'dfib) ; é 次çããåºã 0 > 0 (0.242374 msec) 1 > 1 (0.259262 msec) 2 > 1 (0.301911 msec) 3 > 2 (0.336709 msec) : 10 > 55 (2.254487 msec) 11 > 89 (3.747674 msec) 12 > 144 (6.603675 msec) 13 > 233 (12.642975 msec) 14 > 377 (26.109853 msec)
å®è¡æéãè¦ãã¨ãCPSéåæããå®è¡é度ã2åãããé
ããªãã¾ããããããã¯deferredé¢æ°ã®å
é¨ã§ä½åã«éåæå¼ã³åºããè¡ã£ã¦ããããã§ããé常ã®å¦çã®å ´åã¯ãããã»ã©åé¡ã«ãªããªãã¯ãã ã¨æãã¾ãã
ããã¾ã§ã®ã¾ã¨ã
ã¨ãããã¨ã§ãCPSå¤æã«ããéåæåã¨ãDeferredã«ããéåæåãè¦ã¦ã¿ã¾ããã
Deferredã使ããã¨ã§ãCPSå¤æãããããã楽ã«éåæåãè¡ããã¨ãããã¨ãåããã¾ããã

éåæåã¾ã¨ã
楽ã«ãªã£ãçç±ã®ä¸ã¤ã¨ãã¦ãDeferredã使ããã¨ã«ãã£ã¦å®è¡é åºãã½ã¼ã¹ã³ã¼ãã®è¨è¿°é åºã«è¿ããªã£ãã¨ãããã¨ãããããã¾ãã
ä¸è¬çã«ãã«ãã¹ã¬ãããéåæã®ããã°ã©ã ã§ã¯ãå®è¡ã®é åºãã½ã¼ã¹ã³ã¼ãä¸ãã©ãã©ã«ãªããé ã®ä¸ã§å¦çãã¤ãªããªããã°ãªãã¾ãããããã¯ã¤ã¾ãããã¤ã¯ã¹ãã©å çã主張ããGOTOæã«ããã¹ãã²ãã£ããã°ã©ã ã¨åãç¶æ ã§ããã¨ããã¾ãããã¤ã¯ã¹ãã©å çã¯ãããã°ã©ã ã¯å»ºé ç©ã«æ¯ã¹ã¦åãã¨ããç¹ã§è¨è¨ãé£ããã®ã ãããã½ã¼ã¹ã³ã¼ãï¼è¦ãç®ï¼ã¨å®è¡é åºãä¸è´ãããããªããã°ã©ã ã®æ¸ãæ¹ããã¦è¤éããä¸ããã¹ãã ããã¨ä¸»å¼µãã¾ããã
- Goto statement considered harmful (pdf)
- ãGOTO ã¯æ害ã§ãããã®å è«æã
- radiumsoftware.com ä¸ã®ãGOTO ã¯æ害ã§ãããã¸ã®èå³æ·±ã解説
Deferredã使ããã¨ã§ãã½ã¼ã¹ã³ã¼ãã®è¦ãç®ã¨å®éã®å¦çãè¿ã¥ãããã¨ãåºæ¥ã¾ããã¨ãããã¨ã§ãDeferredã§æ¥½ã«ããããã®ã³ãã¯ãè¦ãç®ã®éãã«å¦çãæµããããã«æ¸ããã¨ã§ãã
é 延è©ä¾¡ã¨éåæ
次ã¯é 延è©ä¾¡ã¨éåæã®é¢ä¿ã§ãããã¡ããçµè«ãå ã«æ¸ãã¨ãDeferredã使ããã¨ã§é 延è©ä¾¡ãã¤ãããã¨ãåºæ¥ã¦ãéåæã§ä¸¦åã»åæ£åã§ããç¡éã®ãã¼ã¿æ§é ãåºæ¥ãããã«ãªãæ°ããã¾ããã
ã¾ããé
延è©ä¾¡ã»ç¡éãªã¹ãã¯å½¹ã«ç«ã¤ã®ãã¨ããåãã«å¯¾ãã¦ã¯ãSICPã®3ç« ãããã¨ãPAIPã¨ãã«è©³ããæ¸ãã¦ããã¾ããç¡éç³»ï¼ãããã¯çµãããç¹å®ã§ããªããã¼ã¿ï¼ãæ±ãã¨ããåé¡ã¯æ°å¤ããã¢ã¼ããã¯ãã£ãã¿ã¼ã³ã®ä¸ã§ããPipe and Filtersãã¨ãã¦å®ç¾©ãã¦ããã¾ããå
·ä½çãªå¿ç¨ä¾ã¨ãã¦ã¯ãUNIXã³ãã³ãã©ã¤ã³ã®ãã¤ãããJavaã®ã¹ããªã¼ã ããã«ãã¡ãã£ã¢ãã¼ã¿ãæ±ããã¬ã¼ã ã¯ã¼ã¯ãªã©æ°å¤ãããã¾ãã
delay/forceãã¯ãã«ããé 延è©ä¾¡
ã¾ãã¯ãå¼æ°ãlambdaã§å ããã¨ã«ããè©ä¾¡ãé ããããã¯ãã§é 延è©ä¾¡ãæ¸ãã¦ã¿ã¾ãã
;; delay, force ãå®ç¾© (defmacro delay (v) (let ((done (gensym)) (val (gensym))) `(lexical-let (,val ,done) (lambda () (unless ,done (setq ,val ,v ,done t)) ,val)))) ;; âã¯ä»¥ä¸ã¨å¤§ä½åã ;; (defmacro delay (v) ;; `(lambda () ,v)) (defun force (v) (funcall v)) ;; é 延è©ä¾¡ç¨ã® car, cdr, cons ãå®ç¾© (defun stream-car (v) (car v)) (defun stream-cdr (v) (if (null v) nil (force (cdr v)))) (defmacro stream-cons (a b) `(cons ,a (delay ,b)))
ã¾ããstream-consã§ã次ã®å¤ããé¢æ°ã§ç¨æãã¦ããã¾ããå¿ è¦ãªã¨ãã« stream-cdr ãå¼ã°ãã訳ã§ããããã®æã«é¢æ°ãå®è¡ãã¦ã次ã®å¤ããç¨æããã¨ããã¤ã¡ã¼ã¸ã§ãããããã使ããã¨ã§ç¡éãªã¹ããå®ç¾©ã§ãã¾ãã
ããã§ã¯ãã£ãããããé 延è©ä¾¡ã使ã£ã¦æ¸ãã¦ã¿ã¾ãã
(defun fib-gen (a b) ; ãã£ããããç¡éãªã¹ãçæé¢æ° (lexical-let ((a a) (b b)) (stream-cons a (fib-gen b (+ a b))))) (setq fibs (fib-gen 0 1)) ; åæå¤ãå ¥ãã¦ç¡éãªã¹ãçæ
é常ã«ã·ã³ãã«ã«åºæ¥ã¾ãããconsã®ä¸ã§ãå¾ãã®å¤ãå帰å¼ã³åºãã«ãã¦ãã¾ããconsãé¢æ°ã§ããã°ç¡éã«ã¼ãï¼å帰ï¼ã§ããããã¯ãã«ããé 延è©ä¾¡ã§å帰ãæ¢ã¾ã£ã¦ãã¾ãã
å®è¡ãã¦ã¿ã¾ãã
(print-stream 50 fibs) ; 50ã¾ã§æ±ãã¦ã¿ã 0 > 1 (0.001115 msec) 1 > 1 (0.002118 msec) 2 > 2 (0.003069 msec) 3 > 3 (0.004030 msec) : : 48 > 7778742049 (0.035559 msec) 49 > 12586269025 (0.036105 msec) 50 > 20365011074 (0.036596 msec)
ããã¾ã§ã®ããã°ã©ã ã«æ¯ã¹ã¦å§åçã«éãã§ããéãçç±ã¯é 延è©ä¾¡ã«ããããã§ã¯ç¡ããä»ã¾ã§ã¨éãã¢ã«ã´ãªãºã ï¼ç·å½¢ã«ã¼ãã®å½¢ï¼ã§è¨ç®ãã¦ããããã§ãã
ãã®ãã£ããããã®ç¡éãªã¹ãã®å½¢ãæ示çå½¢å¼ï¼Explicit Formï¼ã¨å¼ã¶ããã§ããconsã®ä¸ã§ãªã¹ãã®è¦ç´ ãç´æ¥è¨ç®ãã¦ããã¨ããããæ示çããªã®ã ã¨æãã¾ãã
ããã§ã¯æ示çã§ãªããã®ã¯ã©ããªãã®ãã¨ããã¨ããªã¹ãã§ãªã¹ããå®ç¾©ãããããªå½¢ï¼æé»çå½¢å¼ : Implicit Formï¼ã¨ããããã§ãã
ã¾ãã stream-add ã¨ãããªã¹ãå士ã®æ¼ç®ãå®ç¾©ãã¾ãã
;; ãªã¹ãå士ã®è¶³ãç® (defun stream-add (&rest lsts) (apply 'stream-map '+ lsts)) ;; ãªã¹ãå士ã®æ±ç¨æ¼ç® (defun stream-map (proc &rest lsts) (lexical-let ((proc proc)(lsts lsts)) (stream-cons (apply proc (mapcar 'stream-car lsts)) (apply 'stream-map proc (mapcar 'stream-cdr lsts)))))
ããã使ã£ã¦ãã£ããããã®ç¡éãªã¹ããå®ç¾©ããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
(setq fibs (stream-cons 0 (stream-cons 1 (stream-add fibs ; èªåèªèº«ã¨ (stream-cdr fibs))))) ; èªåèªèº«ãä¸ã¤ãããããªã¹ã
Haskellãªã©ã®ãã£ããããã®å®ç¾©ã¨åãå½¢å¼ã§æ¸ãã¾ããã
-- Haskellç fib = 0:1:zipWith (+) fib (tail fib)
å®è¡ãã¦ã¿ã¾ãã
(print-stream 50 fibs) 0 > 1 (0.000191 msec) 1 > 1 (0.001556 msec) 2 > 2 (0.002720 msec) 3 > 3 (0.003751 msec) : : 50 > 20365011074 (0.032877 msec)
ãããããªãéãåãã¾ãããåæçãªããã°ã©ã ãªã®ã§ãã¹ã¦ã®çµæãåºãã¾ã§Emacsãåºã¾ã£ã¦ãã¾ãã¾ãããæ°ã«ãªããªãé度ã§ãã
ã¨ãããã¨ã§ãEmacs Lispã§ã®é
延è©ä¾¡ã®å¾©ç¿ã§ããã次ã¯ããã®é
延è©ä¾¡ãéåæã§ãã£ã¦ã¿ãã¨ããå
容ã§ãã
ç¶ç¶æ¸¡ãï¼callbackï¼ã«ããç¡éãªã¹ã
ä¸ã®é 延è©ä¾¡ã¯åæçãªå®ç¾©ã§ããã®ã§ãããã¾ã§ã¨åæ§ã«çµæãã³ã¼ã«ããã¯ã§åãåããããã«CPSå¤æãã¦ã¿ã¾ããcdrã®çµæãã³ã¼ã«ããã¯ã§è¿ãããã«ãã¦ã¿ã¾ãã
(defun streamcb-car (v) (car v)) (defun streamcb-cdr (v cb) ;; cbã«ç¶ç¶ã§cdrã®å¤ã渡ã£ã¦ãã (if v (funcall (cdr v) cb))) (defun streamcb-cons-gen (a cdr-fun) ;; cdr-funã«ã¯çµæãã³ã¼ã«ããã¯ã§è¿ãé¢æ°ã渡ã (cons a cdr-fun))
ã¡ãã£ã¨ãããããã§ããã以ä¸ã®ããã«ä½¿ãã¾ãã
;; 使ãæ¹ä¾ : (streamcb-car (streamcb-cons-gen 'x (lambda (cb) (funcall cb 'y)))) => x (streamcb-cdr (streamcb-cons-gen 'x (lambda (cb) (funcall cb 'y))) 'identity) => y
ãã£ã±ããã®ã¾ã¾ä½¿ãã®ã¯ç¡çãªã®ã§ããã¯ãã§ã©ãããã¾ãã
;; consã£ã½ãæ¸ããããã«ãããã¯ã (defmacro streamcb-cons (a b) `(streamcb-cons-gen ,a (lambda (cb) (funcall cb ,b) nil)))
ãã®ããã«è¦ãç®ãæ®éã«ãªãã¾ãã
;; 使ãæ¹ä¾ : (streamcb-car (streamcb-cons 'x 'y)) => x (streamcb-cdr (streamcb-cons 'x 'y) 'identity) => y
ããã使ã£ã¦ãã£ããããã®ç¡éãªã¹ããå®ç¾©ãã¦ã¿ã¾ããã¾ãã¯æ示çå½¢å¼ã§ãã
;; æ示çå½¢å¼ (defun fibcb-gen (a b) (lexical-let ((a a)(b b)) (streamcb-cons a (fibcb-gen b (+ a b))))) (setq stream-fibcb (fibcb-gen 0 1))
ç°¡åã«ã§ãã¾ãããå®è¡ãã¦ã¿ã¾ãã
(print-streamcb 100 stream-fibcb) 0 > 1 (0.000584 msec) 1 > 1 (0.001094 msec) 2 > 2 (0.001539 msec) 3 > 3 (0.002005 msec) : 50 > 20365011074 (0.018180 msec)
æ®éã«éãã§ãã次ã¯æé»çå½¢å¼ããã£ã¦ã¿ã¾ãã
ã¾ãç¡éãªã¹ãå士ã®æ¼ç®ãå®ç¾©ãã¾ãã
(defun streamcb-map (proc &rest lsts) (lexical-let ((proc proc)(lsts lsts)) (streamcb-cons (apply proc (mapcar 'streamcb-car lsts)) (apply 'streamcb-map proc (lexical-let (rests) ; åæå®è¡ãä»®å® (mapcar (lambda (lst) (streamcb-cdr lst (lambda (v) (push v rests)))) lsts) (nreverse rests)))))) (defun streamcb-add (&rest lsts) (apply 'streamcb-map '+ lsts))
ä¸ã«æåæçå®è¡ãä»®å®ããã¨ãããããã¾ãã
次ã¯ãã£ãããããå®ç¾©ãã¦ã¿ã¾ãã
;; æé»çå½¢å¼ (setq fibs (streamcb-cons 0 (streamcb-cons 1 (lexical-let (ret) ; ããã§ãåæå®è¡ãä»®å® (streamcb-cdr fibs (lambda (second-fibs) (lexical-let ((second-fibs second-fibs)) (setq ret (streamcb-add fibs second-fibs))))) ret))))
ããã§ãåæçå®è¡ãä»®å®ããã¨ãããããã¾ããããããè¦ã¥ããã§ãã
ããããã¯ãï¼streamcb-acdrï¼ã§æ¬è³ªã®ã¿åãåºãã¨ä»¥ä¸ã®ããã§ãã
;; æé»çå½¢å¼ (setq fibs (streamcb-cons 0 (streamcb-cons 1 (streamcb-acdr fibs ;; èªåèªèº«ã®cdrãåç § (streamcb-add fibs next))))) ;; èªåèªèº«ãåç §
ã¨ãããªãè¦ããããªãã¾ãããå®è¡ãã¦ã¿ãã¨ããªãé ãã§ãã
(print-streamcb 10 fibs) ; é ãã®ã§æ§ãã 0 > 1 (0.000205 msec) 1 > 1 (0.002344 msec) 2 > 2 (0.005933 msec) 3 > 3 (0.012777 msec) : 9 > 55 (0.286495 msec) 10 > 89 (0.490727 msec)
主ãªé
ãåå ã¯ãå
ã»ã©ã®delayã¨ã¯éã£ã¦é
延è©ä¾¡ã«ãã£ãã·ã¥ã®ä»çµã¿ããªãããã§ãããã¨ã¯å¦çãè¤éã«ãªã£ãã¨ãããã¨ãããã¾ãã
éåæã®é£éã«ããç¡éãªã¹ã
ä¸ã§CPSå¤æãè¡ã£ãã®ã§éåæã«ãã¦ã¿ã¾ããããæ¹ã¯å ã»ã©åæ§ãcdrå é¨ã®é¢æ°å¼ã³åºããdeferred:callã§éåæå¼ã³åºãã«ãã¾ãã
(defalias 'streamcba-car 'streamcb-car) ; åã¨åã (defalias 'streamcba-cons 'streamcb-cons) ; åã¨åã (defun streamcba-cdr (v cb) ;; cbã®é¢æ°ã«cdrã®å¤ã渡ã£ã¦ãã ;; deferred:callã§éåæå®è¡ (if v (deferred:call (cdr v) cb)))
次ã«ãã£ããããã®ç¡éãªã¹ããå®ç¾©ãã¦å®è¡ãã¦ã¿ã¾ãã
;; æ示çå½¢å¼ (defun fibcba-gen (a b) (lexical-let ((a a)(b b)) (streamcba-cons a (fibcba-gen b (+ a b))))) (setq stream-fibcba (fibcba-gen 0 1)) ; ç¡éãªã¹ãçæ (print-streamcba 20 stream-fibcba) ; å®è¡ 1 > 0 (0.004411 msec) 2 > 1 (0.013077 msec) 3 > 1 (0.027801 msec) 4 > 2 (0.038971 msec) 5 > 3 (0.046074 msec) : 18 > 1597 (0.120933 msec) 19 > 2584 (0.126033 msec)
ãã®ããã«çµæãåºã¾ãããé度ãæªãããã¾ããã
ãã¦ããã®æ¬¡ã¯æé»çå½¢å¼ãè¡ãã¯ããªã®ã§ãããããã»ã©åæçå®è¡ãä»®å®ããã¨ããããéåæå¾ ã¡åãããªã©ãé§ä½¿ãã¦ãã¾ãæ¸ãç´ããªããã°ãªãã¾ãããããªãç¾å®çã§ãªãã³ã¼ãã«ãªããããªã®ã§ãããã¯ããããã¾ã!!!
Deferredã§ç¡éãªã¹ã
ããã§ã¯ãDeferredã§ç¡éãªã¹ããä½ã£ã¦ã¿ã¾ããå ã»ã©ã¯ cdr ãCPSå¤æãã¾ããã®ã§ãåæ§ã« cdr ãDeferredåãã¾ãã
(defun dstream-car (v) (car v)) (defun dstream-cdr (v) ;; deferredã§cdrã®å¤ã渡ã£ã¦ãã (if v (deferred:call (cdr v)))) (defun dstream-cons-gen (a cb) ;; cbã«ã¯ã³ã¼ã«ããã¯ã§cdrã®å 容ãè¿ãé¢æ° (cons a cb))
以ä¸ã®ããã«ä½¿ãã¾ãã
(defun dmessage (d) ; çµæè¡¨ç¤ºç¨ (deferred:nextc d (lambda (x) (message ">>> %s" x)))) (dstream-car (dstream-cons-gen 'x (lambda () 'y))) => x (dmessage (dstream-cdr (dstream-cons-gen 'x (lambda () 'y)))) => y
ããã使ããããããã«ãã¯ãã«ãã¦ããã¾ãã
(defmacro dstream-cons (a b) `(dstream-cons-gen ,a (lambda () ,b))) (dstream-car (dstream-cons 'x 'y)) => x (dmessage (dstream-cdr (dstream-cons 'x 'y))) => y
ãããã使ã£ã¦æ示çå½¢å¼ã§ãã£ããããã®ç¡éãªã¹ããå®ç¾©ãã¦ã¿ã¾ãã
;; æ示çå½¢å¼ (defun dfib-gen (a b) (lexical-let ((a a)(b b)) (dstream-cons a (dfib-gen b (+ a b))))) (setq dstream-fib (dfib-gen 0 1)) ; ç¡éãªã¹ãçæ (print-dstream 20 dstream-fib) ; å®è¡ 1 > 0 (0.140674 msec) 2 > 1 (0.175473 msec) 3 > 1 (0.183618 msec) : 19 > 4181 (0.414042 msec) 20 > 6765 (0.421383 msec)
ããã¾ã§ã¯ç°¡åã«åºæ¥ã¾ããã次ã¯CPSå¤æã®éåæåã§ã§ããªãã£ãæé»çå®ç¾©ã§ãã
delayã®é 延è©ä¾¡ã¨åæ§ã«ããªã¹ãå士ã®æ¼ç®ãå®ç¾©ãã¾ãã
(defun dstream-map (proc &rest lsts) (lexical-let ((proc proc)(lsts lsts)) (dstream-cons-gen (apply proc (mapcar 'dstream-car lsts)) (lambda () (deferred:$ (deferred:parallel (loop for lst in lsts ;ããã§cdrãè¦æ±ãã¦åãå¦ç collect (lexical-let ((lst lst)) (lambda () (dstream-cdr lst))))) (deferred:nextc it ; ãã¹ã¦ã®ãªã¹ãã®cdrãå¾ ã¡åããã¦æ¬¡ã¸ (lambda (results) (if results (apply 'dstream-map proc results))))))))) (defun dstream-add (&rest lsts) (apply 'dstream-map '+ lsts))
ã¡ããã¨éåæå¾
ã¡åãããå«ãã¦å®è£
ã§ãã¾ããã
ããã§ã¯ãã£ãããããå®ç¾©ãã¦ã¿ã¾ãã
;; æé»çå½¢å¼ (setq dfibs (dstream-cons 0 (dstream-cons 1 (deferred:$ (dstream-cdr dfibs) (deferred:nextc it (lambda (next) (dstream-add dfibs next)))))))
æ¬è³ªã§ãªãã¨ããããã¯ãï¼dstream-acdrï¼ã§ãããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
;; æé»çå½¢å¼ (setq dfibs (dstream-cons 0 (dstream-cons 1 (dstream-acdr dfibs (dstream-add dfibs next))))) (print-dstream 13 fibs) ; å®è¡ 1 > 0 (0.007839 msec) 2 > 1 (0.032135 msec) 3 > 1 (0.055160 msec) : 11 > 55 (2.845847 msec) 12 > 89 (5.046634 msec) 13 > 144 (9.097059 msec)
ããªãé ãã§ãããä½ã¨ãå®è¡ã§ãã¾ããã
ããã¾ã§ã®3ã¤ã®æ¸ãæ¹ï¼DelayãCPSåæãDeferredï¼ã§ã®ããã£ããããã®ç¡éãªã¹ãå®ç¾©ãæ¯ã¹ã¦ã¿ã¾ãã
(setq fibs ; delayã使ã£ãå®ç¾© (stream-cons 0 (stream-cons 1 (stream-add fibs ; â (stream-cdr fibs))))) ; ããã®é çªãéãããã (setq fibscb ; CPSåæã®å®ç¾© (streamcb-cons 0 (streamcb-cons 1 (streamcb-acdr fibs (streamcb-add fibs next))))) (setq dfibs ; deferredã使ã£ãå®ç¾© (dstream-cons 0 (dstream-cons 1 (dstream-acdr dfibs (dstream-add dfibs next)))))
ãã£ããããã®å®ç¾©èªä½ã«ã¯ã»ã¨ãã©å·®ãããã¾ãããå®éã«ã¯ãã®ç¡éãªã¹ããæ±ãæ¹ã®ããã°ã©ã ã®å·®ãããã®ã§ãããã³ã¼ããè¦ãã¨åããã¾ãããããã»ã©å¤§ããã¯ããã¾ããã
Deferredã«ããéåæåãè¡ããã¨ã§ããªãªã¸ãã«ã®delay/forceã®é 延è©ä¾¡ããã°ã©ã ã¨ã»ã¨ãã©å¤ãããªãã¬ãã«ã§ãéåæãªç¡éãªã¹ããæ±ãããã¨ãåããã¾ããã
ããã¾ã§ã®è©¦è¡é¯èª¤ã®çµæãã¾ã¨ããã¨ä¸ã®å³ã®ããã«ãªãã¾ãã

é 延è©ä¾¡ã®éåæåã¾ã¨ã
æ示çå½¢å¼ã¨æé»çå½¢å¼ã®å·®
å
ã»ã©ã®ä¾ã®ä¸ã§ãç¡éãªã¹ãã®æé»çå½¢å¼ã®CPSå¤æã«ããéåæåã¯å°é£ãªã®ã§å®è£
ãããããã¾ããã
ãã®å°é£ã®åå ãçãã§ãããæ示çå½¢å¼ã¨æé»çå½¢å¼ã®éã«ãããã®ãèå¯ãã¦ã¿ã¾ãã
æ示çå½¢å¼ãæé»çå½¢å¼ãèªåèªèº«ã®ãªã¹ãããå¤ãåã£ã¦ãã¦ãéåæã§è¨ç®ãã¦æ¬¡ã®å¤ãä½ãåºãã¨ããæ©è½ã«ã¤ãã¦ã¯åãã§ããããããªããããã©ãããã©ããã£ã¦ãã¼ã¿ãåã£ã¦ããããã¨ããç¹ã«ããã¦ã大ããªéããããã¾ããå³ã«ã¾ã¨ãã¦ã¿ã¾ããã

æ示çå½¢å¼ã¨æé»çå½¢å¼ã®è¨ç®ã®åã
æ示çå½¢å¼ã®æ¹æ³ã¯ãã³ã¼ãã§ç¤ºããã¦ããã¨ããããã§ã«è¨ç®ã«å¿ è¦ãªå¤ãã¹ã³ã¼ãã®ä¸ã«ããã¾ããã§ãã®ã§ãå®éã®è¨ç®ã¯ã¹ã³ã¼ãã®ä¸ã®å¤ãåã£ã¦ãã¦ãã®ã¾ã¾è¨ç®ããã ãã§ããéåæã¯1åã ãã§ãã
ä¸æ¹ã§ãæé»çå½¢å¼ã§ã¯ãè¨ç®ã«å¿ è¦ãªãã¼ã¿ã¯ããªã¹ããã¨ãã¦æ¸¡ããã¦ãã¾ãããããã®æ¸¡ããããªã¹ãããéåæã§å¤ãåã£ã¦ãã¦ã両æ¹ã®ãã¼ã¿ãããã£ãã¨ããã§ãéåæã§è¨ç®ãã¦å¤ãè¿ãã¾ãããã®ãããè¤æ°ã®éåæã®çµæãã¾ã¨ãããéåæå¾ ã¡åããããå¿ è¦ã«ãªãã¾ããããã«ãéåæãé£ç¶ãããããéåæã®å¦çå士ãã¤ãªããã³ã¼ããæ¸ããªããã°ãªãã¾ãããä¸è¬çã«ãããããã¿ã«æ£ããæ¸ããã¨ã¯é常ã«é¢åãªãããæé»çå½¢å¼ã®CPSå¤æã«ããéåæåã¯ããããã¾ããã
ã¨ããã§ãæé»çå½¢å¼ã®è¨ç®ã®ãªãã§ãå®éã«æ¸¡ããããªã¹ãã¯èªåèªèº«ãªã®ã§ãããå¥ã«å ¨ç¶å¥ã®ãªã¹ãã§ãã£ã¦ãããããã§ããã¾ããæ¼ç®ã¯2ã¤ã¾ã§ã¨ããããã§ã¯ãªããæ±ç¨çã«å®ç¾©ããã¦ãã¾ããã¤ã¾ãããå¦çã«æéãããå¤é¨ã®ãã¼ã¿ï¼ãªã¹ãï¼ããããéåæï¼å¹³è¡ã«ï¼ã§ããããã®ãã¼ã¿ãéãã¦ããã¦ãããã«éåæã§è¨ç®ãè¡ã£ã¦ãå¤ãè¿ããã¨ãåºæ¥ãããã§ãã
ããã¯ã©ããã§è¦ããããªåæ£å¦çã§ãã並åã¨ãåæ£ãæ±ããè¨èªç°å¢ã®å ´åãå¦çç³»ãã¾ãã¯ä»å±ã®ã©ã¤ãã©ãªãèªåçã«é åºãã¤ãã¦ä¸¦ååããããåæ£å¦çãã¦ããã¾ããEmacs Lispã§ããéä¿¡ãããã¾ãã§ããã°ãDeferredã使ããã¨ã§æ¥½ã«ä¸¦ååæ£ç°å¢ãåç¾ãããã¨ãã§ãããã§ãã
以ä¸ãé 延è©ä¾¡ãDeferredã§éåæåãã¦ãããã«æé»çå½¢å¼ãå®ç¾©ãããã¨ã§ãåæ£å¦çå¯è½ãªç¡éã®ãã¼ã¿æ§é ãä½ããããªã¨ããã¾ã§ãã¾ããããã®æµããå³ã«ãã¦ã¿ã¾ãããï¼ã¡ãªã¿ã«ãç¢å°ã¯é²åã®æµãã§ã¯ãªãã¦ãèãã¦ãã£ãéçã¨ãããé£æ³ã®ã¤ãªããã®ãããªãã®ã§ããï¼

é 延è©ä¾¡ãã並ååæ£ã¸
deferredã§ç¶ç¶ã§å®ç¾©
æå¾ã¯ãDeferredã®ããä¸ã¤ã®å´é¢ã®ãç¶ç¶ãããããèãã¦ã¿ã¾ãã
JSDeferredã¯çµæã®å¾ ã¡åãããããªã代ããã«ãDeferredãªãã¸ã§ã¯ããåå©ç¨ã§ãã¾ããããã¯ã¤ã¾ããåãå¦çãä½åº¦ãå®è¡ã§ããã¨ãããã¨ã«ãªãã¾ããã¾ããDeferredã®ã¿ã¹ã¯å®ç¾©æã®ã¹ã³ã¼ããã¯ãã¼ã¸ã£ã¼ã§ä¿æåºæ¥ããã¨ãããcall/ccã®ãããªåããåºæ¥ã¾ããå®éã«ãJSDeferredã®ãµã³ãã«ã«ã¯call/ccçãªä»çµã¿ã使ã£ãambï¼é決å®æ§è¨ç®ï¼ã®ä¾ãããã¾ãã
deferred.elããå¾ ã¡åããã®çµæãæ¨ã¦ãããã¨ãã以å¤ã«ã¯ãDeferredãªãã¸ã§ã¯ãã使ãåããã¨ã«ã¤ãã¦ã¯ç¹ã«åé¡ããã¾ããã
ããã§ã¯ã³ã«ã¼ãã³çãªãã®ã使ã£ã¦ã¸ã§ãã¬ã¼ã¿ã¼ãä½ã£ã¦ã¿ã¾ããï¼co-routine èªèº«ã®å®è£ ã¯gistã®ã³ã¼ããåç §ãã¦ã¿ã¦ãã ãããï¼
;; ã¸ã§ãã¬ã¼ã¿ã¼å®ç¾© (defun fib-generator (cc) (lexical-let* ((a 0) (b 1) (n 0)) (co-routine cc (yield a) (yield b) (while t (setq n (+ a b)) (setq a b b n) (yield n))))) (setq fibgen ; ãã£ããããæ°åã¸ã§ãã¬ã¼ã¿ã¼çæ (fib-generator (lambda (x) (message ">> %s" x)))) (funcall fibgen) ; => å®è¡ãããã³ã«ãã£ããããæ°ãä¸ã¤ãã¤è¡¨ç¤ºããã
ã¸ã§ãã¬ã¼ã¿ã¼ã® yield ã®å¼ã®ã¨ããã§ä¸æ¦å¦çãæ¢ã¾ãã¾ããå度ã¸ã§ãã¬ã¼ã¿ã¼ãå®è¡ããã¨ãyieldã§æ¢ã¾ã£ã¦ããå¦çãåéããã¾ããï¼ããã«è¦ãã¾ãï¼
ãã¾ãã¡ããã¨ããå®è£ ã§ã¯ããã¾ãããããã®ããã«ãã£ããããã®æ°åãç¡éã«ã¼ãã®ããã«æ¸ããã¨ãåºæ¥ã¾ãã
ããã¾ã§ã®å®è£ ã¯ãã©ã¡ããã¨ããã¨ããã¼ã¿ãæ±ããããåã ãä½ãåºããã¨ããåãã§ãããããã¡ãã®ã¸ã§ãã¬ã¼ã¿ã¼ã¯å¦çã®ä¸ããå¤ã®ä¸çã«ç©æ¥µçã«ãã¼ã¿ãéãåºãã¦ããæãã«ãªã£ã¦ãã¾ãã
ãã®ããã¼ã¿ãéãåºããã¨ããåãããã¡ãã»ã¼ã¸ãã«å¤ãã¦ã¿ãã¨ããã£ã±ãã©ããã§è¦ãã¢ã¯ã¿ã¼ã¢ãã«ã§ããå®éã«ã¯ãããå°ããã¾ãã¡ãã»ã¼ã¸éåä¿¡ã®ç°å¢ãæ´ããå¿ è¦ãããã¾ãããããããã®ã¢ã¯ã¿ã¼ã®ãããªç¬ç«ããã¹ã¬ããã®ãããªã³ã«ã¼ãã³å¦çãä½ã£ã¦ãã¡ãã»ã¼ã¸ã§éåæéä¿¡ããããã¨ã¯ååå¯è½ã§ãã
ã¨ãããã¨ã§ãDeferredã®ç¶ç¶ã®è©±ããã¢ã¯ã¿ã¼ã¢ãã«ã¾ã§ã¤ãªãã¦ã¿ã¾ããã
éåæã®è¨è¨ã»ã¢ã¼ããã¯ãã£ãããã
ä»åã¯ãæéã®ãããè¨ç®å¦çãã®éåæåãè¡ã£ã¦ã¿ã¾ãããããã¼ã«ã«ã¢ããªã®æéã®ãããå¦çã¯ãã¯ããã£ã¹ã¯ããããã¯ã¼ã¯ã¨ã®IOã§ãããããã¯éåæã®ããªããã£ããªAPIããã£ããããã¨æãã¾ãã®ã§ãéåæåã¯é常ã«ãããããã¨æãã¾ãããã¾ãéåæåãããã¨ã«ãã£ã¦ãã·ã¹ãã ã®è² è·ãä¸ãããä½æé度ãä¸ãããã¨ãåºæ¥ã¾ããéåæãä¸æã«å¶å¾¡ãã¦ããµã¯ãµã¯åãæ°æã¡ããã¢ããªãä½ã£ã¦ãããã®ã§ã¯ãªããã¨æãã¾ãã
ãã¦ãããã¾ã§è¿°ã¹ãCPSå¤æãDeferredã«ããéåæã®ä»ã«ããããããè¨è¨ã»ã¢ã¼ããã¯ãã£ãå¤ãã¦ãã¾ã£ã¦éåæã«ããæ¹æ³ãããã¾ãã
ç¹ã«ãµã¼ãã¼å´ã§ã¯Ajaxãªã©ã®æ¥ç¶æ¹æ³ã®å¤åããC10Kåé¡ã課é¡ã«ãªããã¹ã¬ãããããã»ã¹ãå¢ãããã«å¤§éã®å¦çããã°ãææ³ã¨ãã¦ã¤ãã³ããã¼ã¹ã®éåæãã¬ã¼ã ã¯ã¼ã¯ã注ç®ããã¦ãã¾ãã
大éã®æ¥ç¶ã®åé¡ã ãã§ãªãã巨大ãã¼ã¿ã®æ±ããéåæãä¸å¿ã«ãªãã¾ããåæ£å¦çã ã¨MapReduceãã¾ããªã¼ãã³ã½ã¼ã¹ã®Hadoopãªã©ãæåã§ãããã°ã大éã®ããããã¼ã¿ãªã©ããã¾ãåæ£ãã¦å¹ççã«å¦çããææ³ã§ããããã«æã«ã¯JavaSpaceã¨ãããã£ããããªæ°ããã¾ãã
ãã®ããã«ãéåæã¯ã大éã®ã¢ã¯ã»ã¹ãã大éã®ãã¼ã¿ããåæ£ãããã«ã¯ãã¦ã¼ã¶ã¼ã¤ã³ã¿ãã§ã¼ã¹ããæ±ãã®ã«å¿
é ã®æè¡ã ã¨è¨ãã¾ããéã«è¨ãã¨ãéåæããããã®ä»äºã¨è¨ããã®ããããã¾ããã
éåæãããã¯ãå®è£ ãããã
æå¾ã«ããããããããªéåæã®ãããã¯ãå®è£ ãããã¤ãããã¦ã¿ã¾ãã
YAPCãªã©ãè¦ã¦ãã¨ãPerl å¨è¾ºã¯ãµã¼ãã¼ã®éåæåãé²ãã§ããããã§ãã¨ã¦ã楽ãããã§ãã
- YAPC::Asia 2009 / Asynchronous Programming for (A)synchronous Communication
- コルーチンとウェブアプリケーション・スケーラビリティ - subtech
Perlçéã®é£½ããªã姿å¢ã¯å¤§å¤åºæ¿ã«ãªãã¾ããä»å¹´ã®åç»ã¯ã¾ã è¦ãã¦ã¾ããã
AnyEventã«ã¤ãã¦ã¯ãã¡ããè¦ã¦ã¿ã¾ããã
æããMicrosoftãè² ãã¦ã¾ããã.NET4ããDeferredã£ã½ãAPIãæ¥ãããã§ãã
WaitAny, WaitAll ãããæãã§ããRxã¨ããã©ã¤ãã©ãªããããããããã§ãã
éåæã¿ã¹ã¯ãªã®ã«SQLã¿ãããªæ¸ãæ¹ã«ãªã£ã¦ãã¦ãããã楽ãããã§ãããRxå§ã¾ãããã¦ããä»æ´è¨ãã®ãã¢ã¬ã§ãããããã¯ç¢ºå®ã«ã¤ãããããã°ã¦ã§ã¼ãã¯ããæ¢ã«æ¥ã¦ããä¹ãé ãã¦ããããã§ä¹ããï¼ãã ããã§ãã
ç¦å²¡ã®ã¹ã¿ã¼ãã¢ããã§ãéåæã§éãå¦çããã¾ãããªãã¦ããããã§ãã
ä»é±ã¯ãå®è·µã¯ã©ã¦ãæè¡ã»ããã¼ç¦å²¡ãã§ãã¾ãã«HadoopãScalaã®è©±ããã£ãããã§ãã
æ¥åã·ã¹ãã ãªã©ã§éåæã¨æ¥ãã¨ãã¡ãã»ã¼ã¸ã³ã°ã·ã¹ãã ã«è©±ãé£ãã ããã¾ãã
- メッセージキュー - Wikipedia
- AP4R,Rubyで非同期メッセージング:第1回 軽量さと堅牢さを兼ね備えたメッセージング|gihyo.jp
- Q4M - a Message Queue for MySQL
ãã¸ãã¹ç³»ã ã¨IBMã®MQããã使ã£ããããã¿ããã§ããããã¾ããã¡ã®è¿æã§ã¯è¦ããã¨ãããã¾ãããããããSIerããã¨éä¿¡ãããã¨ãéä¿¡ãTCPã½ã±ããã§æä½ãããããWindowså ±æãã©ã«ãã«ãã¡ã¤ã«ãç½®ãå½¢ã®éåæã¡ãã»ã¼ã¸ã³ã°ãããè¦ããã¾ããä¾ã«ãã£ã¦ãããããç¬èªä»æ§ã ã£ããããã®ã§ãããä¸æã«ããã«ã¦ã¨ã¢ï¼ã寿å½ã®çããªã¼ãã³ã½ã¼ã¹ã®å®è£ ï¼ã«ä¾åããããã¯ãã®éä½åå¹´ã®ç¤¾å ã©ã¤ãã©ãªã®æ¹ã寿å½ãé·ãã¦ããã®ããããã¾ããã
ãã ãè¯ãããã®ããUIã®æä½ã¨ç´çµãã¦åæéä¿¡ã§åéç¡ããã¨ããè¨è¨ï¼ã¾ãã¯ä»æ§ï¼ã§ããããã«ããã¯ããããªãã®ãã¨ãæãããã§ããã§ãéåæã¡ãã»ã¼ã¸ã³ã°ã¨ããããªæ¥åè¨è¨ã絡ã¿åã£ã¦æ··ä¹±ããããé¤ãé 給ãããããªã¡ãã»ã¼ã¸ãä¸æã«ãã¥ã¼ããã¦æå³ããææ¥å±ãã¦ã²ãããæ»ã¬ããã¯ãUIã«é信失æãåºã¦ãã¦ããããããªãé»è©±ã§ãã¨ããããããææ¥ã·ã¹ãã ãç´ã£ã¦ããæä½ãç´ãã¾ããã¨ãªãç§æçæ¥åï¼è¯ãè¨ãã°ã·ã¹ãã é害ã«å¯¾ãããªã¹ã¯å¯¾å¿ãåºæ¥ã¦ããï¼ã¨ããã®ã¯ãã°ããããªãã¨ãæãããã§ãã
ã¾ã éä¸ã§ãããæè¿ãã®æ¬ãèªãã§ãã¾ãããããããªããã°ã©ãã³ã°ã®ãã©ãã¤ã ããè¨èªã®å®è£ ãéãã¦èª¬æãã¦ãã¦ãè¨èªã®æé·ã¨ã¯ãããããã¨ãã¨ãããã¨ãåãã£ã¦ãããããã§ããç¹ã«ã並åãã«ã¤ãã¦ã®èª¬æããã£ã¨ç¶ãã¦ãã¦ããããããªã¢ããã¼ãããããã¨ãåå¼·ã«ãªãã ãã§ãªãã人ã¯ãã£ã¨ä¸¦ååã®ãã¨ã°ããèãã¦ããã®ã ãªãã¨æãã¾ããã

- ä½è : ã»ã¤ãã»ããªãã£,ãã¼ã¿ã¼ã»ã´ã¡ã³ã»ãã¤,Peter Van-Roy,Seif Haridi,羽永æ´
- åºç社/ã¡ã¼ã«ã¼: ç¿æ³³ç¤¾
- çºå£²æ¥: 2007/11/08
- ã¡ãã£ã¢: 大åæ¬
- è³¼å ¥: 9人 ã¯ãªãã¯: 304å
- ãã®ååãå«ãããã° (64件) ãè¦ã
ã¾ã¨ã¾ãã®ãªãæç« ã§ãã¿ã¾ããã
ï¼2010/10/24 ããã°ã©ã ã®ééããªã©ãä¿®æ£ï¼