I am opposed to breaking backwards compatibility for this. However, one possibility would be to do the thing I suggested _iff_ the exception is non-transparent. Then everything that works would keep working, and future issues like this would not arise.
Sam On Wed, May 4, 2016 at 5:12 PM, 'John Clements' via Racket Users <[email protected]> wrote: > >> On May 4, 2016, at 12:48 PM, Eli Barzilay <[email protected]> wrote: >> >> On Wed, May 4, 2016 at 1:14 PM, John Clements <[email protected]> >> wrote: >>> >>>> On May 4, 2016, at 9:59 AM, Sam Tobin-Hochstadt <[email protected]> >>>> wrote: >>>> >>>> That seems fine, but the general approach the handin-server is taking >>>> seems wrong to me. If it wants an exception with a different message, >>>> it should just create that, rather than assuming that all exception >>>> structures are reasonable to modify. >>> >>> Well, I can certainly do both. >>> >>> In general, perhaps the right solution for the handin server would be >>> to deliver an exn:fail:handin-server with an additional field >>> containing the original exception. That way, no information is lost. >>> >>> The danger, of course, is that this might break code that depends on >>> the exception satisfying some predicate (the filesystem and network >>> exceptions are the ones that worry me). Perhaps Eli can comment on >>> this? >> >> TBH, I have no memory of this -- and looking at the code (I'm assuming >> it's the `reraise` bit in `wrap-evaluator`??) I'm not sure that I wrote >> it. >> >> [...Doing some archaeological digging...] >> >> OK, I think that the following is everything that I can say about it, >> and let you judge what would be the best way to re-solve it. I think >> that the main thing that changed that you're talking about is Matthew's >> comment that "All the built-in exn structs are fully transparent, >> though". Also, there's the motivation for doing this: "It's important >> to keep the same exception, because ...". (And both of these might be a >> justification to make it transparent, or to fix it in a different way >> that makes the "because" thing work, and maybe make a note of the lack >> of transparency somewhere; I have no significant opinion about it.) > > So, I’d say this is basically an ergonomics issue. If we change this code to > raise a new exception, then it might potentially confuse a > handin-server-checker-writer, who expects (e.g.) to see a > ‘exn:fail:contract:variable?’ but actually gets back a > ‘exn:fail:handin-server?’. IIUC, clear documentation could resolve this. > > Of course, this would be a breaking change for people who currently use the > handin-server with such tests, but I’m generally in favor of breaking > backward compatibility to make the world a better place. > > Is this change making the world a better place? > > John > >> >> So -- assuming that function is the right place that you're talking >> about, I see that this is code that I committed in: >> >>> commit fd858f081c564a3c94a682aee5896bc535fd9956 >>> Author: Eli Barzilay <[email protected]> >>> Date: 2007-01-24 07:52:51 +0000 >>> >>> removed the tweaker hack for a solution that creates a new exception >>> >>> svn: r5446 >> >> and it removes a simple hack that uses a `current-error-message-tweaker` >> ("tweaker" is surely mine...) and adds instead the code that assembles a >> new exception. >> >> I then did some more digging in my mail, and found this email exchange >> between me and Matthew about this: >> >> [Eli] >>> For some corner of the handin server I wanted to capture exceptions, >>> then reraise a modified version of the exception (basically turn any >>> exn to one that has "<same message> while evaluating <some expr>"). >>> It's important to keep the same exception, because some tests rely >>> on it (like catching an `exn:fail:contract:variable?' when testing >>> for a bound identifier). >>> >>> Looks like `copy-struct' is not enough, because it wants a struct-id. >>> Is there some easy way to do that? (I know that it's possible, >>> because I did similar stuff in reflecting mzscheme structs as swindle >>> classes, but I'm looking for a simple solution.) >> >> [Matthew] >>> If you have a sufficiently powerful inspector, then `struct-info' >>> and `struct-type-info' let you do what you want, and that's the only >>> possibility that I see. >> >> [Eli] >>> Does the code below look reasonable? -- I'm using struct-info just >>> to make sure that struct->vector does return all the field values. >>> (I think that this code will break with auto fields, but it should >>> be fine with the exn hierarchy.) >>> >>> (define ((make-chatty-eval eval) expr) >>> (define (reraise exn) >>> (raise >>> (let-values ([(struct-type skipped?) (struct-info exn)]) >>> (if (and struct-type (not skipped?)) >>> (let ([vals (vector->list (struct->vector exn))]) >>> (apply (struct-type-make-constructor struct-type) >>> (string->immutable-string >>> (format "while evaluating ~s:\n ~a" expr (cadr vals))) >>> (cddr vals))) >>> e)))) >>> (with-handlers ([exn? reraise]) (eval expr))) >> >> [Matthew] >>> Looks fine to me. >>> >>> I don't think the use of `struct-type' ensures that `struct->vector' >>> returns all the fields. The immediate struct could be transparentand >>> the next one opaque. All the built-in exn structs are fully >>> transparent, though. >> >> [Eli] >>> OK -- so I thought that a proper solution would be to check the >>> chain up the all the way (and just mention that in a comment in case >>> someone uses this code), but then I realized that there is a much >>> simpler way: simply define a local unique value, hand that as the >>> second argument to struct->vector, and make sure that the unique >>> value is not a memq of the result. >> >> -- >> ((x=>x(x))(x=>x(x))) Eli Barzilay: >> http://barzilay.org/ Maze is Life! > > > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

