diff --git a/collects/racket/generics.rkt b/collects/racket/generics.rkt index 5aaa637481..766f2e44ab 100644 --- a/collects/racket/generics.rkt +++ b/collects/racket/generics.rkt @@ -14,10 +14,10 @@ (define-syntax (define-generics stx) ; allows out-of-order / optional kw args (syntax-case stx () ; can't use syntax-parse, since it depends on us - [(_ (name) (generic . generics-args) ...) - #'(define-generics (name #:defined-table defined-table) + [(_ name (generic . generics-args) ...) + #'(define-generics name #:defined-table defined-table (generic . generics-args) ...)] - [(_ (name #:defined-table defined-table) + [(_ name #:defined-table defined-table (generic . generics-args) ...) (local [(define name-str (symbol->string (syntax-e #'name))) (define (id . strs) diff --git a/collects/scribblings/reference/generics.scrbl b/collects/scribblings/reference/generics.scrbl index 6e5bf96c05..4289eb05b4 100644 --- a/collects/scribblings/reference/generics.scrbl +++ b/collects/scribblings/reference/generics.scrbl @@ -15,8 +15,7 @@ using a @racket[define-generics] form. Method implementations for a structure type are defined using the @racket[#:methods] keyword (see @secref["define-struct"]). -@defform/subs[(define-generics (gen:name prop:name name? - [#:defined-table defined-table]) +@defform/subs[(define-generics name [#:defined-table defined-table] [method . kw-formals*] ...) ([kw-formals* (arg* ...) @@ -27,22 +26,12 @@ a structure type are defined using the @racket[#:methods] keyword (code:line keyword id) (code:line keyword [id])]) #:contracts - ([gen:name identifier?] - [prop:name identifier?] - [name? identifier?] + ([name identifier?] + [defined-table identifier?] [method identifier?])]{ Defines @racket[gen:name] as a transformer binding for the static -information about a new generic group. - -Defines @racket[prop:name] as a structure type property. Structure -types implementing this generic group should have this property where -the value is a vector with one element per @racket[method] where each -value is either @racket[#f] or a procedure with the same arity as -specified by @racket[kw-formals*]. (@racket[kw-formals*] is similar to -the @racket[kw-formals] used by @racket[lambda], except no expression is -given for optional arguments.) The arity of each method is checked by -the guard on the structure type property. +information about a new generic interface. Defines @racket[name?] as a predicate identifying instances of structure types that implement this generic group. @@ -50,7 +39,7 @@ types that implement this generic group. Defines each @racket[method] as a generic procedure that calls the corresponding method on values where @racket[name?] is true. Each method must have a required by-position argument that is -@racket[free-identifier=?] to @racket[gen:name]. This argument is used in +@racket[free-identifier=?] to @racket[name]. This argument is used in the generic definition to locate the specialization. The optional @racket[defined-table] argument should be an identifier. @@ -89,7 +78,7 @@ with @racket[#:methods]. @(define evaluator (new-evaluator)) @examples[#:eval evaluator -(define-generics (printable) +(define-generics printable (gen-print printable [port]) (gen-port-print port printable) (gen-print* printable [port] #:width width #:height [height])) diff --git a/collects/tests/generics/from-docs.rkt b/collects/tests/generics/from-docs.rkt index f5ca5e9427..a83a51206c 100644 --- a/collects/tests/generics/from-docs.rkt +++ b/collects/tests/generics/from-docs.rkt @@ -2,7 +2,7 @@ (require racket/generics racket/port) -(define-generics (printable) +(define-generics printable (gen-print printable [port]) (gen-port-print port printable) (gen-print* printable [port] #:width width #:height [height])) diff --git a/collects/tests/generics/from-unstable.rkt b/collects/tests/generics/from-unstable.rkt index f10bf4df76..a9c5e33f78 100644 --- a/collects/tests/generics/from-unstable.rkt +++ b/collects/tests/generics/from-unstable.rkt @@ -13,7 +13,7 @@ (test #:on-pass 'quiet (local - [(define-generics (lots) + [(define-generics lots (f #:foo foo lots zog [def])) (define-struct ex () @@ -26,7 +26,7 @@ (f (make-ex) 2 #:foo 3) => 1)) (local - [(define-generics (lots) + [(define-generics lots (f #:foo foo lots zog #:def [def])) (define-struct ex () @@ -39,7 +39,7 @@ (f (make-ex) 3 #:foo 1) => 1)) (local - [(define-generics (lots) + [(define-generics lots (f lots idx val)) (define-struct ex () @@ -53,7 +53,7 @@ (f (make-ex) 4 1) => (expt 2 4))) (local - [(define-generics (table) + [(define-generics table (get table idx [default]) (weird-get idx table) (put! table idx new)) @@ -92,18 +92,18 @@ 1)) (test #:on-pass 'quiet - (define-generics (table) + (define-generics table (get idx [default])) =error> "No required by-position generic argument" - (define-generics (table) + (define-generics table (get idx [table] [default])) =error> "No required by-position generic argument") - (local [(define-generics (printable) + (local [(define-generics printable (gen-print printable [port]) (gen-port-print port printable) (gen-print* printable [port] #:width width #:height [height]))