Hi Alaric,
On Wed 18 May 2011 12:19, Alaric Snell-Pym <
alaric@x> writes:
> On 05/18/11 09:32, Andy Wingo wrote:
>> The docs for `guard' note that if no cond clause matches, that the
>> exception is re-raised:
>>
>> "then `raise' is re-invoked on the raised object within the dynamic
>> extent of the original call to `raise' except that the current
>> exception handler is that of the `guard' _expression_."
>>
>> But it also notes that the exception handler's continuation and dynamic
>> context are that of the guard _expression_.
>>
>> What does it mean to specify that the object is re-raised from the
>> original `raise' dynamic context? AFAICS there is no way to know what
>> the dynamic context is at the time of `raise', as the dynamic state is
>> unwound before invoking the handler.
>
> The dynamic state isn't unwound.
Are you sure? :-) The spec notes:
"That implicit `cond' _expression_ is evaluated with the continuation
and dynamic extent of the `guard' _expression_"
and
"The final _expression_ in a <cond> clause is in a tail context if the
`guard' _expression_ itself is."
These two sentences indicate to me that my example:
>> (define p (make-parameter 0))
>> (define f
>> (lambda ()
>> (guard (e ((p)))
>> (parameterize ((p (+ (p) 1)))
>> (raise #t)))))
should unwind the dynamic state, and that this program:
(define p (make-parameter 0))
(define f
(lambda ()
(guard (e ((zero? (p)) (f))
(else (p)))
(parameterize ((p 1))
(raise #t)))))
should never complete (i.e., it should loop indefinitely with no
additional memory consumption).
Andy
--
http://wingolog.org/