I've figured out where the error is coming from, but I still have no idea what's going on.
racket/private/generic-methods.rkt starting on line 174:
(define-syntax (generic-methods stx)
(syntax-case stx ()
[(_ gen def ...)
(let ()
(define info (get-info 'generic-methods stx #'gen))
(define orig-id (generic-info-name info))
(define methods (map (make-method-delta #'gen orig-id)
(generic-info-method-names info)))
(with-syntax ([(method ...) methods])
(syntax/loc stx
(syntax-parameterize ([generic-method-outer-context #'gen])
(letrec-syntaxes+values
([(method) (make-unimplemented 'method)] ...)
()
(syntax-parameterize ([generic-method-inner-context #'gen])
def ...
(values (implementation method) ...)))))))]))
I didn't change this code at all, but something about how I'm setting up the generic interface is causing this to give the ambiguous binding error.
I'm getting the error for get method, which came from a super interface (gen:getter), but the has? method, which comes directly from the sub interface (gen:pattern), works fine.
#lang racket/base
(require racket/generic rackunit racket/private/generic-methods
syntax/macro-testing
(for-syntax racket/base syntax/parse))
(define-generics getter
(get getter target))
(define-generics pattern
(has? pattern target)
#:extends gen:getter)
(generic-methods
gen:pattern
(define (has? this target) (pair? target))) ; this works fine
(convert-compile-time-error
(generic-methods
gen:pattern
(define (get this target) (car target)))) ; this gives an ambiguous binding error
Any help?