For the time being I've decided to use this macro and attach contracts to the fallbacks a different way. Please let me know if there's a better solution.
(define-syntax-rule (I/weak/c [method-id method-contract] ...) (I/c [method-id (or/c #f method-contract)] ...) On 4/17/21 10:48 PM, Sage Gerard wrote: > Playing with this program. Its output is in the comments. > > ; /tmp/gen.rkt:9:10: assertion violation > ; expected: a procedure > ; given: #f > ; in: method m > ; (I/c (m (-> I? 1))) > ; [...removed the rest of the error...] > ; 1 > > (module gen-contracts racket/base > (require racket/contract racket/exn racket/generic) > (define-generics I [m I] #:fallbacks [(define (m _) 1)]) > (struct noop () #:methods gen:I []) > (struct impl () #:methods gen:I [(define (m _) 1)]) > (define (try ctor) > (displayln > (with-handlers ([exn:fail:contract? exn->string]) > (m (invariant-assertion (I/c [m (-> I? 1)]) (ctor)))))) > (try noop) > (try impl)) > > I expected the output to be just two "1" lines, because I assumed the > contract combinator from `define-generics` would consider fallback > implementations. I do think it makes sense for `I/c` to fail to apply a > contract to a method in `noop` because `noop` doesn't implement `m`. But I > think the combinator reuses some logic from whatever is making > `#:defined-predicate` work, since it represents missing methods as `#f`, and > doesn't look at the fallbacks. > > But... I wanted a contract that's okay with a missing method if there's a > fallback. The only contracts I can write with the `I/c` combinator seem > require me to either A) write repetitive method definitions that just parrot > the fallback, or B) write its method contracts like `(I/c [m (or/c #f (-> I? > 1))])`, which feels icky. > > Apologies if I'm totally off the mark or just missed something in the manual, > but is there a way to define a contract for a generics implementation that > won't complain if it sees a fallback for a missing method? > > -- > ~slg > > -- > 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]. > To view this discussion on the web visit > [https://groups.google.com/d/msgid/racket-users/fed6c561-881b-08af-4318-25750f198133%40sagegerard.com](https://groups.google.com/d/msgid/racket-users/fed6c561-881b-08af-4318-25750f198133%40sagegerard.com?utm_medium=email&utm_source=footer). -- ~slg -- 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]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/747816e3-44de-9af8-a284-873007c4e57d%40sagegerard.com.

