Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Question about callcc

Reply
Thread Tools

Question about callcc

 
 
Sam Kong
Guest
Posts: n/a
 
      10-11-2006
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?

Thanks.

Sam

 
Reply With Quote
 
 
 
 
Carlos
Guest
Posts: n/a
 
      10-11-2006
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.
--



 
Reply With Quote
 
 
 
 
Ken Bloom
Guest
Posts: n/a
 
      10-11-2006
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.
 
Reply With Quote
 
Sam Kong
Guest
Posts: n/a
 
      10-12-2006
Hi Ken,

Ken Bloom wrote:
> On Thu, 12 Oct 2006 01:59:26 +0900, Carlos wrote:
>
>>> callcc { |c| $label = c }
>>> As I understand it, callcc returns the last expression or return value

>> 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)


Although I still don't understand what's going on in the back,
I see the difference.

Thank you very much.

Sam

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Callcc problem in Generator Greg Fitzgerald Ruby 0 01-25-2005 06:35 AM
callcc Semantics Bill Atkins Ruby 2 10-19-2004 03:47 AM
callcc performance non-linear wrt stack size - why? Mikael Brockman Ruby 2 09-25-2004 06:52 PM
ruby, actors, continuations, Kernel#callcc zuzu Ruby 14 08-23-2004 03:02 AM
Why does Ruby have callcc? Jim Bob Ruby 22 08-08-2003 01:28 PM



Advertisments