Note: Continuation 相关的几个链接

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”
    理解continuation

  • IBM 社区文档里的, 比较详细:
    Scheme语言深入
    Continuation 和高级流程控制

  • Continuation From Wikipedia

初步理解

详细用法不大理解, 实现原理完全不理解...

大致上几篇文章串起来: 尾递归原因, 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)
)

我说了, 还不懂.. 就先记这些

你可能感兴趣的:(lisp)