Node 0.12.x
要增加发功能了, Generator 语法.. Python Ruby 早有了
表示还不会用就去看了 Lua 的 coroutine, 看不懂只好微博上吐槽..
然后某写 Clojure 的呃.. 朋友.. 回了我一句:
http://weibo.com/2652916941/AEWflhZtO
想彻底理解,需要先看看continuation, callcc的概念,然后试试lua的coroutine和ruby的fiber,再看看elrang的actor,一脉相承的模型。
感觉是说到点子上了, 我只是朦朦胧胧知道这些是一脉相承的,
Golang 也类似吧.. 总之为此又去看关于 Continuation 相关的内容
资源
很久前在知乎上问的, 回答质量非常高啊:
怎样理解 Continuation-passing style?Shining Ray 翻译的讲解 CPS 的文章, 比较浅:
简介延续“Continuation”
理解continuationIBM 社区文档里的, 比较详细:
Scheme语言深入
Continuation 和高级流程控制
初步理解
详细用法不大理解, 实现原理完全不理解...
大致上几篇文章串起来: 尾递归原因, CPS 是六十年代就开始有了的,
Continuation 是 Lisp 里计算的术语, 本身很常见,
用法上升级为用 Continuation 暴露流程出来给程序控制.
简单的比如, 这里 k
是 Continuation, 但是直接返回了 5
:
(call/cc (lambda (k) 5))
然后可以模拟 return
, 这里 return
是 Continuation, 可以产生中断:
(call/cc (lambda (return)
(for-each (lambda (x) (if (< x 0) (return x)))
'(99 88 77 66 55))
Continuation 具体还是保存下来的的运算过程, 比如这里的代码,
我多次执行 (it)
, 实际上 "before"
只打印一次, "after"
三次:
; run with `racket demo.rkt`
(module demo racket/base
(provide it)
(define it #f)
(define (test)
(let ((i 0))
(display "before")
(call/cc (lambda (k) (set! it k)))
(display "after")
(set! i (+ i 1))
3))
(test)
(it)
(it)
(it)
)
我说了, 还不懂.. 就先记这些
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。