I've pushed a fix for this and the related bug that I mentioned in this thread. No important performance improvements, however (I believe most of the time in ->i microbenchmarks is spent in just piping things around, not doing the actual contract checking).
Robby On Wed, Dec 14, 2016 at 5:33 PM, Alexis King <[email protected]> wrote: > This question comes from someone else on Stack Overflow, which they > asked here: http://stackoverflow.com/q/41144374/465378 > > I think it’s likely that the people who can answer this are probably > only on the mailing list, though, so I figured I’d ask it here. > > Basically, the ->i contract applies contract projections more than > once, despite the fact that it seems unnecessary. Here’s the example > provided in the question: > > (define/contract (foo x y z) > (->i ([x (λ (x) (begin (displayln 0) #t))] > [y (x) (λ (y) (begin (displayln 1) #t))] > [z (x y) (λ (z) (begin (displayln 2) #t))]) > any) > #t) > > (foo 1 2 3) > > The above example prints the following when run: > > 0 > 0 > 1 > 1 > 2 > #t > > This indicates that values used dependently for determining other > contracts cause their contracts to be applied more than once. The > above example only uses flat contracts, but I tested with a > side-effectful impersonator contract and got the same result. > > After some very simple pondering, I couldn’t come up with a situation > in which applying the contracts more than once would be necessary, > and this could obviously have a performance penalty given that ->i > is already a fairly slow contract. Is this a bug in ->i, or is it > necessary or intentional behavior? If the latter, why is it necessary? > > Alexis > > -- > 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.

