Oh, I see! Thanks a lot for the clarification (and thorough explanation). I saw this line from the documentation
(apply throw args))))) ; and pass the error on up and didn't take into account the signature of throw. Thanks again! On Sat, 18 Jul 2020 at 22:01, <[email protected]> wrote: > throw is (throw tag . info), that is it takes its trailing args and puts > them > in a list. The first throw gets the args: 'some-error "..." 1. It > passes > these as: 'some-error ("..." 1) to the first error handler (that's why > you > can apply format to cadr -- cadr has been turned into a list). You > throw > that again using apply, so its args the second time are: some-error > '("..." 1), > (I'm trying to show that the second call is not like the first -- it has > only one trailing arg, the list '("..." 1). Once again throw treats it > as > a rest arg, and puts it in a list, then the second error handler sees: > some-error (("..." 1)). If you want to rethrow, the second throw needs > to match the first one, use (apply throw (car args) (cadr args)). > It might be better to use (lambda (type info) for the error handler, > so you can say > > (catch #t > (lambda () > (catch #t > (lambda () > (throw 'some-error "::: ERROR ::: (~A)~%" 1)) > (lambda (type info) > (apply format *stderr* info) > (apply throw type info)))) > (lambda (type info) > (apply format *stderr* info) > )) > >
_______________________________________________ Cmdist mailing list [email protected] https://cm-mail.stanford.edu/mailman/listinfo/cmdist
