Re: more srfi-12 rationale? Dave Mason 17 Oct 1999 13:54 UTC
>>>>> On Sun, 17 Oct 1999 08:26:24 -0400, Richard Kelsey <xxxxxx@research.nj.nec.com> said: > Works fine for me. The barf exception gets passed to the outer > exception handler. Ah yes. The problem was my initial *current-exn-handler*. I *thought* the model implementation should work, but when my example didn't, I thought that I somehow misunderstood something about the call/cc and dynamic-wind interaction. > He may have convinced you, but he hasn't convinced me. As Per > Bothner said, exception systems are normally used to separate normal > from abnormal results. Why should sending abnormal results need to > be *very* cheap? Or even particularly cheap at all? It's the > normal results that have to be delivered quickly. This may be my ML experience showing. call/cc isn't part of portable ML, so people use exceptions to implement short-circuit evaluation and such-like that I guess you'd claim should be implemented directly with call/cc in Scheme. But I still think we should facilitate an inexpensive implementation, even if the reference implementation uses generic scheme. > References: <199910160912.FAA15873@kima.nj.nec.com> Date: Sun, 17 > Oct 1999 00:22:18 -0400 From: Dave Mason <xxxxxx@sarg.ryerson.ca> >> The SRFI-12 exception mechanism *is* cheap, but the *condition* >> mechanism isn't cheap at all. It requires (in general) creating an >> object for every raised exception. > You don't have to use conditions if you don't want to. (Perhaps > this is the reason for allowing non-conditions to be signalled?) > And if you do use conditions, there is nothing that requires that a > fresh condition be signalled each time. You can make one and use it > over and over again. The values in it can be changed via a side > effect, if you want. I'm not worried about explicit aborts in my program - I can do as you say. My concern is built-in low-level aborts. Like (/ x 0). If these dynamically create ``condition'' values, it will be expensive. >> I don't like the fact that it needs to do a dynamic-wind and a >> call/cc to set up an exception and the continuation is actually >> called whether or not an exception is raised (because it appears >> that dynamic-wind isn't values-aware). > I don't understand. `With-exception-handler' does a dynamic-wind > but not a call/cc. Given the handler's dynamic extent there is no > way to avoid the dynamic-wind (unless you go outside R5RS; some > implementations have shortcuts for dynamic variables). > The call/cc is needed in `handle-exceptions' to allow the handler to > return from from `handle-exceptions'. The call to the continuation > for the non-exception case isn't required, that is just the way they > wrote the code. I think that handle-exceptions is what virtually everyone will use (because the exception should run in the enclosing exception environment). Hence, they'll get both the call/cc and the dynamic-wind. > R5RS says that `dynamic-wind' should handle multiple values. Quite right. There was a detail of the implementation that I didn't understand, which led me to believe that it was dynamic-wind that was complaining when I tried to get rid of the normal-case continuation call. > I agree with you, although for different reasons. Restarts should > be left to another SRFI. Without restarts, WITH-EXCEPTION-HANDLER doesn't have to be exposed in the programming interface, and I see implementation approaches that could make HANDLE-EXCEPTIONS much lower cost. With restarts, you essentially need the dynamic-wind, call/cc pair to do HANDLE-EXCEPTIONS. If most built-in exceptions call the *current-exn-handler* with a constant argument (regardless of whether or not there are ``condition''s), an abort-only mechanism could certainly be as efficient as I'd like to see. ../Dave