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/