From 3bfaa2b00b6d28623cdcc2536d7646af8fa4344e Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Mon, 21 May 2012 21:10:16 -0400 Subject: [PATCH] New naming convention for generics names. --- collects/data/order.rkt | 16 ++++---- collects/data/scribblings/order.scrbl | 4 +- collects/data/skip-list.rkt | 6 +-- collects/data/splay-tree.rkt | 4 +- collects/racket/dict.rkt | 2 +- collects/racket/private/dict.rkt | 28 ++++++------- collects/racket/stream.rkt | 16 ++++---- collects/scribblings/reference/dicts.scrbl | 4 +- collects/scribblings/reference/generics.scrbl | 40 +++++++++---------- .../scribblings/reference/sequences.scrbl | 20 +++++----- collects/tests/generics/alist.rkt | 2 +- collects/tests/generics/custom-hash.rkt | 4 +- collects/tests/generics/equal+hash.rkt | 21 ++++++++++ collects/tests/generics/stream.rkt | 4 +- 14 files changed, 96 insertions(+), 75 deletions(-) create mode 100644 collects/tests/generics/equal+hash.rkt diff --git a/collects/data/order.rkt b/collects/data/order.rkt index 7f9950c99d..bfdd5c4cc6 100644 --- a/collects/data/order.rkt +++ b/collects/data/order.rkt @@ -10,13 +10,13 @@ (provide ordering/c) -(define-generics (ordered-dict prop:ordered-dict ordered-dict?) - (dict-iterate-least ordered-dict) - (dict-iterate-greatest ordered-dict) - (dict-iterate-least/>? ordered-dict key) - (dict-iterate-least/>=? ordered-dict key) - (dict-iterate-greatest/? gen:ordered-dict key) + (dict-iterate-least/>=? gen:ordered-dict key) + (dict-iterate-greatest/i ([d ordered-dict?]) @@ -40,7 +40,7 @@ ;; -------- -(provide ordered-dict) +(provide gen:ordered-dict) (provide/contract [prop:ordered-dict (struct-type-property/c prop:ordered-dict-contract)] diff --git a/collects/data/scribblings/order.scrbl b/collects/data/scribblings/order.scrbl index 2a9695c7a2..1482142c30 100644 --- a/collects/data/scribblings/order.scrbl +++ b/collects/data/scribblings/order.scrbl @@ -25,7 +25,7 @@ Contract for orderings, represented by the symbols @racket['=], } @deftogether[[ -@defthing[ordered-dict any/c] +@defthing[gen:ordered-dict any/c] @defthing[prop:ordered-dict (struct-type-property/c (vectorof _e/c _e/c _s/c _s/c _s/c _s/c))] @@ -33,7 +33,7 @@ Contract for orderings, represented by the symbols @racket['=], Struct-type property for defining new ordered dictionary types. Methods can be attached to the @racket[prop:ordered-dict] struct property -using the @racket[methods] form and the @racket[ordered-dict] generic +using the @racket[methods] form and the @racket[gen:ordered-dict] generic interface. Two ``extrema'' methods and four ``search'' methods should be implemented. The extrema methods must satisfy @racket[_e/c] and the search methods must satisfy @racket[_s/c]: diff --git a/collects/data/skip-list.rkt b/collects/data/skip-list.rkt index 1e731d6b9d..e6549703ec 100644 --- a/collects/data/skip-list.rkt +++ b/collects/data/skip-list.rkt @@ -357,7 +357,7 @@ Levels are indexed starting at 1, as in the paper. (vector-immutable any/c any/c skip-list-iter? #f #f #f)) #:property prop:ordered-dict - (methods ordered-dict + (methods gen:ordered-dict (define dict-iterate-least skip-list-iterate-least) (define dict-iterate-greatest skip-list-iterate-greatest) (define dict-iterate-least/>? skip-list-iterate-least/>?) @@ -373,7 +373,7 @@ Levels are indexed starting at 1, as in the paper. (lambda (s) (skip-list*-value-c s)) #f)) #:property prop:ordered-dict - (methods ordered-dict + (methods gen:ordered-dict (define dict-iterate-least skip-list-iterate-least) (define dict-iterate-greatest skip-list-iterate-greatest) (define dict-iterate-least/>? skip-list-iterate-least/>?) @@ -395,7 +395,7 @@ Levels are indexed starting at 1, as in the paper. (lambda (s) (adjustable-skip-list*-value-c s)) #f)) #:property prop:ordered-dict - (methods ordered-dict + (methods gen:ordered-dict (define dict-iterate-least skip-list-iterate-least) (define dict-iterate-greatest skip-list-iterate-greatest) (define dict-iterate-least/>? skip-list-iterate-least/>?) diff --git a/collects/data/splay-tree.rkt b/collects/data/splay-tree.rkt index d271136602..48c1bf9e12 100644 --- a/collects/data/splay-tree.rkt +++ b/collects/data/splay-tree.rkt @@ -523,7 +523,7 @@ Options splay-tree-iter? #f #f #f)) #:property prop:ordered-dict - (methods ordered-dict + (methods gen:ordered-dict (define dict-iterate-least n:splay-tree-iterate-least) (define dict-iterate-greatest n:splay-tree-iterate-greatest) (define dict-iterate-least/>? n:splay-tree-iterate-least/>?) @@ -541,7 +541,7 @@ Options (lambda (s) (node-splay-tree*-value-c s)) #f)) #:property prop:ordered-dict - (methods ordered-dict + (methods gen:ordered-dict (define dict-iterate-least n:splay-tree-iterate-least) (define dict-iterate-greatest n:splay-tree-iterate-greatest) (define dict-iterate-least/>? n:splay-tree-iterate-least/>?) diff --git a/collects/racket/dict.rkt b/collects/racket/dict.rkt index 39f2ed6634..908829fb17 100644 --- a/collects/racket/dict.rkt +++ b/collects/racket/dict.rkt @@ -217,7 +217,7 @@ (->i ([d dict?]) [_r (d) (listof (cons/c (dict-key-contract d) (dict-value-contract d)))])]) -(provide dict +(provide gen:dict prop:dict make-custom-hash diff --git a/collects/racket/private/dict.rkt b/collects/racket/private/dict.rkt index a1173fec63..e3d45c8108 100644 --- a/collects/racket/private/dict.rkt +++ b/collects/racket/private/dict.rkt @@ -3,20 +3,20 @@ (require racket/private/generics ; to avoid circular dependencies (for-syntax racket/base)) -(define-generics (dict prop:dict dict? #:defined-table dict-def-table +(define-generics (gen:dict prop:dict dict? #:defined-table dict-def-table ;; private version needs all kw args, in order #:coerce-method-table #f #:prop-defined-already? #f) - (dict-ref dict key [default]) - (dict-set! dict key val) - (dict-set dict key val) - (dict-remove! dict key) - (dict-remove dict key) - (dict-count dict) - (dict-iterate-first dict) - (dict-iterate-next dict pos) - (dict-iterate-key dict pos) - (dict-iterate-value dict pos)) + (dict-ref gen:dict key [default]) + (dict-set! gen:dict key val) + (dict-set gen:dict key val) + (dict-remove! gen:dict key) + (dict-remove gen:dict key) + (dict-count gen:dict) + (dict-iterate-first gen:dict) + (dict-iterate-next gen:dict pos) + (dict-iterate-key gen:dict pos) + (dict-iterate-value gen:dict pos)) (define (assoc? v) (and (list? v) (andmap pair? v))) @@ -428,7 +428,7 @@ (struct custom-hash (table make-box) #:property prop:dict - (methods dict + (methods gen:dict (define dict-ref custom-hash-ref) (define dict-set! custom-hash-set!) (define dict-remove! custom-hash-remove!) @@ -448,7 +448,7 @@ (struct immutable-custom-hash custom-hash () #:property prop:dict - (methods dict + (methods gen:dict (define dict-ref custom-hash-ref) (define dict-set custom-hash-set) (define dict-remove custom-hash-remove) @@ -506,7 +506,7 @@ ;; -------------------- -(provide dict +(provide gen:dict prop:dict (rename-out [d:dict? dict?] diff --git a/collects/racket/stream.rkt b/collects/racket/stream.rkt index d33d6e2e4a..7d4b44782c 100644 --- a/collects/racket/stream.rkt +++ b/collects/racket/stream.rkt @@ -13,7 +13,7 @@ (provide empty-stream stream-cons stream? - generic-stream + gen:stream ;; we don't need the generics versions of these because ;; the original sequence functions will work fine ;; for the dispatch. (the method table layout is @@ -39,15 +39,15 @@ stream-add-between stream-count) -(define-generics (generic-stream prop:stream stream? - #:defined-table defined-table - #:coerce-method-table #f - #:prop-defined-already? stream-get-generics) +(define-generics (gen:stream prop:stream stream? + #:defined-table defined-table + #:coerce-method-table #f + #:prop-defined-already? stream-get-generics) ;; These three are never used for the reasons explained above. ;; We still need the headers for clients who extend racket/stream. - (stream-empty? generic-stream) - (stream-first generic-stream) - (stream-rest generic-stream)) + (stream-empty? gen:stream) + (stream-first gen:stream) + (stream-rest gen:stream)) (define-syntax stream (syntax-rules () diff --git a/collects/scribblings/reference/dicts.scrbl b/collects/scribblings/reference/dicts.scrbl index 5096684923..e3eca996e8 100644 --- a/collects/scribblings/reference/dicts.scrbl +++ b/collects/scribblings/reference/dicts.scrbl @@ -529,7 +529,7 @@ Returns a list of the associations from ]} @deftogether[[ -@defthing[dict any/c] +@defthing[gen:dict any/c] @defthing[prop:dict struct-type-property?]]]{ A @tech{structure type property} (see @secref["structprops"]) that @@ -575,7 +575,7 @@ type. The following methods can be implemented: @examples[#:eval dict-eval (struct alist (v) #:property prop:dict - (methods dict + (methods gen:dict (define (dict-ref dict key [default (lambda () (error "key not found" key))]) (cond [(assoc key (alist-v dict)) => cdr] diff --git a/collects/scribblings/reference/generics.scrbl b/collects/scribblings/reference/generics.scrbl index b7257ef053..dc150a2bf6 100644 --- a/collects/scribblings/reference/generics.scrbl +++ b/collects/scribblings/reference/generics.scrbl @@ -9,7 +9,7 @@ @defmodule[racket/generics] -@defform/subs[(define-generics (name prop:name name? +@defform/subs[(define-generics (gen:name prop:name name? [#:defined-table defined-table]) [method . kw-formals*] ...) @@ -21,12 +21,12 @@ (code:line keyword id) (code:line keyword [id])]) #:contracts - ([name identifier?] + ([gen:name identifier?] [prop:name identifier?] [name? identifier?] [method identifier?])]{ -Defines @racket[name] as a transformer binding for the static +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 @@ -44,7 +44,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[name]. This argument is used in +@racket[free-identifier=?] to @racket[gen:name]. This argument is used in the generic definition to locate the specialization. The optional @racket[defined-table] argument should be an identifier. @@ -57,38 +57,38 @@ availability. } -@defform[(generics name +@defform[(generics gen:name [method . kw-formals*] ...) #:contracts - ([name identifier?] + ([gen:name identifier?] [method identifier?])]{ Expands to -@racketblock[(define-generics (name _prop:name _name?) +@racketblock[(define-generics (gen:name _prop:name _name?) [method . kw-formals*] ...)] where @racket[_prop:name] and @racket[_name?] are created with the lexical -context of @racket[name]. +context of @racket[gen:name]. } -@defform[(methods name definition ...) +@defform[(methods gen:name definition ...) #:contracts - ([name identifier?])]{ + ([gen:name identifier?])]{ -@racket[name] must be a transformer binding for the static information +@racket[gen:name] must be a transformer binding for the static information about a new generic group. Expands to a value usable as the property value for the structure type -property of the @racket[name] generic group. +property of the @racket[gen:name] generic group. -If the @racket[definition]s define the methods of @racket[name], then +If the @racket[definition]s define the methods of @racket[gen:name], then they are used in the property value. -If any method of @racket[name] is not defined, then @racket[#f] is used +If any method of @racket[gen:name] is not defined, then @racket[#f] is used to signify that the structure type does not implement the particular method. @@ -120,14 +120,14 @@ Syntactically an error when used outside @racket[methods]. @(define evaluator (new-evaluator)) @examples[#:eval evaluator -(define-generics (printable prop:printable printable?) - (gen-print printable [port]) - (gen-port-print port printable) - (gen-print* printable [port] #:width width #:height [height])) +(define-generics (gen:printable prop:printable printable?) + (gen-print gen:printable [port]) + (gen-port-print port gen:printable) + (gen-print* gen:printable [port] #:width width #:height [height])) (define-struct num (v) #:property prop:printable - (methods printable + (methods gen:printable (define/generic super-print gen-print) (define (gen-print n [port (current-output-port)]) (fprintf port "Num: ~a" (num-v n))) @@ -139,7 +139,7 @@ Syntactically an error when used outside @racket[methods]. (define-struct bool (v) #:property prop:printable - (methods printable + (methods gen:printable (define/generic super-print gen-print) (define (gen-print b [port (current-output-port)]) (fprintf port "Bool: ~a" diff --git a/collects/scribblings/reference/sequences.scrbl b/collects/scribblings/reference/sequences.scrbl index f0a753a20a..eaf1681eac 100644 --- a/collects/scribblings/reference/sequences.scrbl +++ b/collects/scribblings/reference/sequences.scrbl @@ -73,7 +73,7 @@ except that @racket[_k] by itself is not a @tech{stream}. Custom sequences can be defined using structure type properties. The easiest method to define a custom sequence is to use the -@racket[prop:stream] property and the @racket[generic-stream] +@racket[prop:stream] property and the @racket[gen:stream] extension interface. Streams are a suitable abstraction for data structures that are directly iterable. For example, a list is directly iterable with @racket[first] and @racket[rest]. On the other hand, @@ -89,7 +89,7 @@ that can be represented as streams: @examples[#:eval stream-evaluator (struct unrolled-list-iterator (idx lst) #:property prop:stream - (methods generic-stream + (methods gen:stream (define (stream-empty? iter) (define lst (unrolled-list-iterator-lst iter)) (or (null? lst) @@ -776,7 +776,7 @@ A shorthand for nested @racket[stream-cons]es ending with The new stream is constructed lazily.} @deftogether[[ -@defthing[generic-stream any/c] +@defthing[gen:stream any/c] @defthing[prop:stream struct-type-property?]]]{ Associates three procedures to a structure type to implement stream @@ -795,13 +795,13 @@ A shorthand for nested @racket[stream-cons]es ending with @examples[#:eval stream-evaluator (define-struct list-stream (v) #:property prop:stream - (methods generic-stream - (define (stream-empty? generic-stream) - (empty? (list-stream-v generic-stream))) - (define (stream-first generic-stream) - (first (list-stream-v generic-stream))) - (define (stream-rest generic-stream) - (rest (list-stream-v generic-stream))))) + (methods gen:stream + (define (stream-empty? stream) + (empty? (list-stream-v stream))) + (define (stream-first stream) + (first (list-stream-v stream))) + (define (stream-rest stream) + (rest (list-stream-v stream))))) (define l1 (list-stream '(1 2))) (stream? l1) diff --git a/collects/tests/generics/alist.rkt b/collects/tests/generics/alist.rkt index 66f0e79beb..6a14eaf4d9 100644 --- a/collects/tests/generics/alist.rkt +++ b/collects/tests/generics/alist.rkt @@ -4,7 +4,7 @@ (define-struct alist (v) #:property prop:dict - (methods dict + (methods gen:dict (define (dict-ref dict key [default (lambda () (error "key not found" key))]) (cond [(assoc key (alist-v dict)) => cdr] diff --git a/collects/tests/generics/custom-hash.rkt b/collects/tests/generics/custom-hash.rkt index 917d06e372..811eebe9cc 100644 --- a/collects/tests/generics/custom-hash.rkt +++ b/collects/tests/generics/custom-hash.rkt @@ -2,7 +2,7 @@ (require racket/generics (only-in racket/dict - dict prop:dict + gen:dict prop:dict dict? dict-ref dict-set! @@ -42,7 +42,7 @@ (struct custom-hash (table make-box) #:property prop:dict - (methods dict + (methods gen:dict (define dict-ref custom-hash-ref) (define dict-set! custom-hash-set!) (define (dict-set dict key val) diff --git a/collects/tests/generics/equal+hash.rkt b/collects/tests/generics/equal+hash.rkt new file mode 100644 index 0000000000..1dc74ca86c --- /dev/null +++ b/collects/tests/generics/equal+hash.rkt @@ -0,0 +1,21 @@ +#lang racket + +;; vectors as method tables +(struct kons (kar kdr) + #:property prop:equal+hash + (vector 'ta + (lambda (x y rec) + (and (rec (kons-kar x) (kons-kar y)) + (rec (kons-kdr x) (kons-kdr y)))) + (lambda (x y) 12) + (lambda (x y) 13))) + +(module+ test + (require rackunit) + + (check-equal? (kons 1 2) (kons 1 2)) + (check-false (equal? (kons 1 2) 2)) + (check-false (equal? 2 (kons 1 2))) + (check-false (equal? (kons 1 2) (kons 3 4))) + (check-equal? (equal-hash-code (kons 1 2)) 60) + ) diff --git a/collects/tests/generics/stream.rkt b/collects/tests/generics/stream.rkt index f09bdf039e..e9bc7a0f8f 100644 --- a/collects/tests/generics/stream.rkt +++ b/collects/tests/generics/stream.rkt @@ -4,7 +4,7 @@ (define-struct list-stream (v) #:property prop:stream - (methods generic-stream + (methods gen:stream (define (stream-empty? generic-stream) (empty? (list-stream-v generic-stream))) (define (stream-first generic-stream) @@ -14,7 +14,7 @@ (struct vector-stream (i v) #:property prop:stream - (methods generic-stream + (methods gen:stream (define (stream-first x) (vector-ref (vector-stream-v x) (vector-stream-i x))) (define (stream-rest x) (vector-stream (add1 (vector-stream-i x))