From: Ken Bloom Date: 2006-10-12T04:40:17+09:00 Subject: Re: Question about callcc On Thu, 12 Oct 2006 01:59:26 +0900, Carlos wrote: > Sam Kong wrote: > >> Hi, >> >> I'm trying to understand continuation. >> There's some confusion in the following: >> >> In top-level, >> >> [1] >> callcc { |c| $label = c } >> #...some other code here >> $label.call >> >> [2] >> $label = callcc { |c| c } >> #...some other code here >> $label.call >> >> >> Are they same or different? >> As I understand it, callcc returns the last expression or return value >> of c.call. >> Thus, basically [1] and [2] should be same, right? >> But I'm not sure. >> Can anyone explain it, please? > > callcc returns the return value of its block, the first time. Later, it > returns the value it was called with. > If you test [2], you'll see the error message: > undefined method `call' for nil:NilClass (NoMethodError) > > Try > $label = callcc {|c| c} > $label.call(3) > > and > $label = callcc {|c| puts "first call"; c} > $label.call(lambda{puts "second call"}) > > to understand what's going on. This example (run in straight ruby, not irb) should clarify what's going on. begin $label=nil $label=callcc{|c| c} puts "After the first callcc" $label.call rescue StandardError=>e puts e end begin $label=nil callcc{|c| $label=c} puts "After the second callcc" $label.call rescue StandardError=>e puts e end [bloom@cat-in-the-hat ~]$ ruby callcc.rb | head After the first callcc After the first callcc undefined method `call' for nil:NilClass After the second callcc After the second callcc After the second callcc After the second callcc After the second callcc After the second callcc After the second callcc (infintie loop) -- Ken Bloom. PhD candidate. Linguistic Cognition Laboratory. Department of Computer Science. Illinois Institute of Technology. http://www.iit.edu/~kbloom1/ I've added a signing subkey to my GPG key. Please update your keyring.