Tag: callcc

阴阳之谜如何工作?

我试图在Scheme中掌握call / cc的语义,而在维基百科的延续页面上则以阴阳益智为例: (let* ((yin ((lambda (cc) (display #\@) cc) (call-with-current-continuation (lambda (c) c)))) (yang ((lambda (cc) (display #\*) cc) (call-with-current-continuation (lambda (c) c)))) ) (yin yang)) 它应该输出@*@**@***@****@… ,但我不明白为什么; 我期望它输出@*@********* … 有人可以详细解释为什么阴阳益智的工作方式?

什么叫/ cc?

我已经多次尝试了解延续的概念,并且呼吁/ cc 。 每一次尝试都是失败的。 有人可以解释我这些概念,理想情况下比维基百科或其他SOpost更实际的例子。 我有Web编程和面向对象的背景。 我也了解6502程序集,并与Erlang有一个小小的争执。 不过,我还是不能把头绕在call / cc上。

延续和callback有什么区别?

我一直在浏览整个networking,寻找关于延续的启示,想到最简单的解释会如此完全混淆像我这样的JavaScript程序员,令人惊讶。 当大多数文章用Scheme中的代码解释延续或使用monad时,情况尤其如此。 现在我终于认为我已经理解了延续的本质,我想知道我所知道的是否是事实。 如果我的想法是真实的,那么这是无知而不是启蒙。 所以,这就是我所知道的: 在几乎所有的语言中,函数显式地将值(和控制)返回给调用者。 例如: var sum = add(2, 3); console.log(sum); function add(x, y) { return x + y; } 现在,在使用第一类函数的语言中,我们可以将控制和返回值传递给callback函数,而不是显式地返回给调用者: add(2, 3, function (sum) { console.log(sum); }); function add(x, y, cont) { cont(x + y); } 因此,不是从函数返回值,而是继续使用另一个函数。 所以这个函数被称为第一个的延续。 那么延续和callback有什么区别呢?