[iterate-devel] [clisp-list] Re: handler-bind macroexpansion and special operators (fwd)

Thomas F. Burdick tfb at OCF.Berkeley.EDU
Fri Jan 14 21:33:59 UTC 2005


Bruno Haible writes:
 > Joerg-Cyril Hoehle wrote:
 > > Every program or library which does code-walking and comes across
 > > IGNORE-ERRORS or HANDLER-BIND in CLISP will barf on this.
 > 
 > Yes. Like HANDLER-BIND, like COMPILER-LET, is a primitive that cannot be
 > emulated using macroexpansions in clisp.
 > 
 > > Having a useful response from SPECIAL-OPERATOR-P would at least help these
 > > to correctly recognize the situation at hand.
 > 
 > I don't agree. The purpose of the statement in CLHS 3.1.2.1.2.2
 > 
 >   "An implementation is free to implement any macro operator as a special
 >    operator, but only if an equivalent definition of the macro is also
 >    provided."
 > 
 > is obviously that code walkers will use the macro definition and not
 > have special code for HANDLER-BIND. But this macro definition cannot
 > do anything else than expand into something containing SYS::%HANDLER-BIND,
 > and at this point the code walker would barf as well.
 > 
 > So the code walkers need a bit of #+clisp code for either HANDLER-BIND
 > or SYS::%HANDLER-BIND. The former is better, since HANDLER-BIND is a
 > documented symbol whose meaning won't change.

For a fix to the immediate problem, why not change the syntax of
sys::%handler-bind to match normal function call syntax:

  (%handler-bind body-thunk 'condition1 handler1 'condition2 handler2 ...)

instead of

  (%handler-bind ((condition1 handler1) (condition2 handler2) ...)
                 (funcall body-thunk))

Even if %handler-bind can't be written as a primitive function (I
don't know CLISP's internals, so I'll have to take your word for it),
this should be good enough for most code walkers.



More information about the iterate-devel mailing list