I think you're right, and I remember when implementing GUARD for my R6RS
noting that it's non-trivial, and now I realize I got the re-raise part
wrong. ;-)   The language appears the same, replacing "dynamic environment "
with "dynamic extent" for the R7 draft -- I think I prefer the former term
though.

But as Alaric noted, it's possible to get it right by saving a continuation
in the exception handler before jumping out for the cond clauses.

On Wed, May 18, 2011 at 10:28 AM, Andy Wingo <[email protected]> wrote:

> Hi Alaric,
>
> On Wed 18 May 2011 12:19, Alaric Snell-Pym <[email protected]>
> 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/
>
> _______________________________________________
> Scheme-reports mailing list
> [email protected]
> http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports
>
_______________________________________________
Scheme-reports mailing list
[email protected]
http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports

Reply via email to