[racket] call/cc not working as expected in DrScheme
Thanks Matthew, that was very enlightening!
I do get the behaviour I had expected if I type `((lambda () (stop)
(stop) 42))' instead.
The funny thing is, I thought `(begin exp ...)' was nothing more than a
syntactic abbreviation of `((lambda () exp ...))', but apparently there
is an exception for the top level. Granted, this exception is described
in R5RS, but I had failed to see the consequences of this on captured
continuations!
Regards,
Bas
On 8/19/10 20:13 PM, Matthew Flatt wrote:
> At Thu, 19 Aug 2010 19:04:49 +0200, Bas Steunebrink wrote:
>> Hi all,
>>
>> From what I understand about call/cc, when a saved continuation is
>> invoked, the current continuation should be discarded. So I expected the
>> following program to just print `stop?' once; however, it doesn't stop.
>>
>>
>> Welcome to DrScheme, version 4.2.4 [3m].
>> Language: Pretty Big; memory limit: 128 megabytes.
>> > (define stop
>> (let ((k (call-with-current-continuation (lambda (k) k))))
>> (lambda ()
>> (display "stop?\n")
>> (k k))))
>> > (begin (stop) (stop) 42)
>> stop?
>> stop?
>> 42
>> >
>>
>>
>> So is this an error in my understanding of call/cc or in DrScheme?
>
> You need two more pieces of information:
>
> * When `begin' appears in a top-level position, its expressions are
> spliced into the top level.
>
> * Every top-level expression is evaluated inside a "prompt" that
> delimits continuation capture and invocation.
>
> So, each call to `stop' discards only the continuation up to the prompt
> that wraps the call to `stop'.
>