论坛首页 编程语言技术论坛

帮忙看一个continuation的小程序,谢谢。

浏览 2498 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-22  
ruby 代码
 
  1. class ContinuationDemo  
  2.   def self.loop  
  3.     cont = nil  
  4.     for i in 1..4  
  5.       puts i  
  6.       callcc {|continuation| cont = continuation} if i == 2  
  7.     end  
  8.     return cont  
  9.   end  
  10. end  
  11.   
  12. c = ContinuationDemo.loop  
  13. c.call  

运行结果是:
1
2
3
4
3
4
3
4... 3,4会一直循环。

这是为什么呢? 我的理解是,loop的时候会输出1234,然后创建一个continuation对象并返回。c.call的时候就会回到代码的第6行,用当时的堆栈信息执行程序知道结束。

那么,假设程序是在return cont后结束,结果就应该是123434;假设程序会再次调用c.call(也就是又第13行),那么结果应该是123434123434....。这个12343434...是怎么来的呢?
   发表时间:2006-11-22  
c = ContinuationDemo.loop 
这一行执行后打印出1,2,3,4
c.call
这一行执行后跳回上次callcc时的执行环境,c = ContinuationDemo.loop的位置,执行循环里剩下的部分,打印出3和4,然后又执行c.call,如此循环,于是结果就是1234343434。。。

做个实验:
$counter = 0
class ContinuationDemo
  def self.loop
    cont = nil
    for i in 1..4
      puts i
      callcc {|continuation| cont = continuation} if i == 2
    end
    $counter += 1
    return cont
  end
end

c = ContinuationDemo.loop
puts "=="
c.call if $counter < 5

结果:
1
2
3
4
==
3
4
==
3
4
==
3
4
==
3
4
==

JE的代码拷下来怎么带行号的?出错了一次,删得手疼,将就着看吧。。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics