[racket-dev] [plt] Push #20853: master branch updated

From: Jay McCarthy (jay.mccarthy at gmail.com)
Date: Wed Aug 11 19:41:25 EDT 2010

I'd like comments on this addition in response to the blog post we saw
on the list today.

Jay

On Wed, Aug 11, 2010 at 5:40 PM,  <jay at racket-lang.org> wrote:
> jay has updated `master' from 8dc38e9d84 to e06f0e78b2.
>  http://git.racket-lang.org/plt/8dc38e9d84..e06f0e78b2
>
> =====[ 4 Commits ]======================================================
>
> Directory summary:
>  17.8% collects/racket/private/
>  29.6% collects/scribblings/reference/
>  20.9% collects/tests/racket/
>   9.4% collects/tests/unstable/
>  18.9% collects/unstable/scribblings/
>   3.2% collects/unstable/
>
> ~~~~~~~~~~
>
> db87add Jay McCarthy <jay at racket-lang.org> 2010-08-11 16:37
> :
> | Adding hash-domain and hash-range to racket/base
> :
>  M collects/racket/private/base.rkt            |    4 +++-
>  A collects/racket/private/hash.rkt
>  M collects/scribblings/reference/hashes.scrbl |   11 +++++++++++
>  M collects/tests/racket/basic.rktl            |    5 +++++
>  M collects/unstable/hash.rkt                  |    8 --------
>
> ~~~~~~~~~~
>
> 58ad011 Jay McCarthy <jay at racket-lang.org> 2010-08-11 16:42
> :
> | Adding hash->list
> :
>  M collects/racket/private/hash.rkt            |   11 +++--
>  M collects/scribblings/reference/hashes.scrbl |    6 +++
>  M collects/tests/racket/basic.rktl            |    1 +
>  M collects/tests/unstable/hash.rkt            |   12 ------
>  M collects/unstable/scribblings/hash.scrbl    |   51 ------------------------
>
> ~~~~~~~~~~
>
> fadfee7 Jay McCarthy <jay at racket-lang.org> 2010-08-11 16:49
> :
> | Normalizing docs a little
> :
>  M collects/scribblings/reference/hashes.scrbl |    9 ++++++---
>
> ~~~~~~~~~~
>
> e06f0e7 Jay McCarthy <jay at racket-lang.org> 2010-08-11 17:39
> :
> | Adding hash-set* and hash-set*bang
> :
>  M collects/racket/private/hash.rkt            |   22 ++++++++++++++-
>  M collects/scribblings/reference/hashes.scrbl |   26 +++++++++++++++++
>  M collects/tests/racket/basic.rktl            |   36 ++++++++++++++++++++++--
>
> =====[ Overall Diff ]===================================================
>
> collects/racket/private/base.rkt
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> --- OLD/collects/racket/private/base.rkt
> +++ NEW/collects/racket/private/base.rkt
> @@ -1,6 +1,7 @@
>  (module base "pre-base.rkt"
>
> -  (#%require "list.rkt"
> +  (#%require "hash.rkt"
> +             "list.rkt"
>              "string.rkt"
>              "stxcase-scheme.rkt"
>              "qqstx.rkt"
> @@ -21,6 +22,7 @@
>                               regexp-replace*
>                               new-apply-proc)
>              struct
> +             (all-from "hash.rkt")
>              (all-from "list.rkt")
>              (all-from-except "string.rkt"
>                               -regexp-replace*)
>
> collects/racket/private/hash.rkt
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> --- /dev/null
> +++ NEW/collects/racket/private/hash.rkt
> @@ -0,0 +1,33 @@
> +(module hash "pre-base.rkt"
> +  (define (hash-domain table)
> +    (hash-map table (λ (k v) k)))
> +
> +  (define (hash-range table)
> +    (hash-map table (λ (k v) v)))
> +
> +  (define (hash->list table)
> +    (hash-map table cons))
> +
> +  (define (hash-set* table . pairs)
> +    (unless (even? (length pairs))
> +      (error 'hash-set* "expected an even number of association elements, but received an odd number: ~e" pairs))
> +    (let loop ([table table]
> +               [pairs pairs])
> +      (if (null? pairs)
> +          table
> +          (loop (hash-set table (car pairs) (cadr pairs))
> +                (cddr pairs)))))
> +
> +  (define (hash-set*! table . pairs)
> +    (unless (even? (length pairs))
> +      (error 'hash-set*! "expected an even number of association elements, but received an odd number: ~e" pairs))
> +    (let loop ([pairs pairs])
> +      (unless (null? pairs)
> +        (hash-set! table (car pairs) (cadr pairs))
> +        (loop (cddr pairs)))))
> +
> +  (provide hash-domain
> +           hash-range
> +           hash->list
> +           hash-set*
> +           hash-set*!))
> \ No newline at end of file
>
> collects/scribblings/reference/hashes.scrbl
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> --- OLD/collects/scribblings/reference/hashes.scrbl
> +++ NEW/collects/scribblings/reference/hashes.scrbl
> @@ -180,6 +180,18 @@ Maps @scheme[key] to @scheme[v] in @scheme[hash], overwriting
>  any existing mapping for @scheme[key].
>
>  @see-also-caveats[]}
> +
> + at defproc[(hash-set*! [hash (and/c hash? (not/c immutable?))]
> +                     [key any/c]
> +                     [v any/c]
> +                     ...
> +                     ...) void?]{
> +
> +Maps each @scheme[key] to each @scheme[v] in @scheme[hash], overwriting
> +any existing mapping for each @scheme[key]. Mappings are added from the left, so
> +later mappings overwrite earlier mappings.
> +
> + at see-also-caveats[]}
>
>
>  @defproc[(hash-set [hash (and/c hash? immutable?)]
> @@ -192,6 +204,20 @@ Functionally extends @scheme[hash] by mapping @scheme[key] to
>  returning the extended hash table.
>
>  @see-also-mutable-key-caveat[]}
> +
> + at defproc[(hash-set* [hash (and/c hash? immutable?)]
> +                    [key any/c]
> +                    [v any/c]
> +                    ...
> +                    ...)
> +          (and/c hash? immutable?)]{
> +
> +Functionally extends @scheme[hash] by mapping each @scheme[key] to
> + at scheme[v], overwriting any existing mapping for each @scheme[key], and
> +returning the extended hash table. Mappings are added from the left, so
> +later mappings overwrite earlier mappings.
> +
> + at see-also-mutable-key-caveat[]}
>
>  @defproc[(hash-ref [hash hash?]
>                    [key any/c]
> @@ -303,7 +329,27 @@ otherwise the traversal skips a deleted key or uses the remapped key's
>  new value.
>
>  @see-also-concurrency-caveat[]}
> +
> + at defproc[(hash-domain [hash hash?])
> +         (listof any/c)]{
> +Returns a list of the keys of @scheme[hash] in an unspecified order.
> +
> +See @scheme[hash-map] for information about modifying @scheme[hash]
> +during @scheme[hash-domain]. @see-also-concurrency-caveat[]}
>
> + at defproc[(hash-range [hash hash?])
> +         (listof any/c)]{
> +Returns a list of the values of @scheme[hash] in an unspecified order.
> +
> +See @scheme[hash-map] for information about modifying @scheme[hash]
> +during @scheme[hash-range]. @see-also-concurrency-caveat[]}
> +
> + at defproc[(hash->list [hash hash?])
> +         (listof (cons/c any/c any/c))]{
> +Returns a list of the key--value pairs of @scheme[hash] in an unspecified order.
> +
> +See @scheme[hash-map] for information about modifying @scheme[hash]
> +during @scheme[hash->list]. @see-also-concurrency-caveat[]}
>
>  @defproc[(hash-for-each [hash hash?]
>                         [proc (any/c any/c . -> . any)])
>
> collects/tests/racket/basic.rktl
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> --- OLD/collects/tests/racket/basic.rktl
> +++ NEW/collects/tests/racket/basic.rktl
> @@ -2363,8 +2363,44 @@
>   (check-all-bad hash-iterate-key)
>   (check-all-bad hash-iterate-value))
>
> +(test (list 1 2 3) hash-domain #hasheq((1 . a)(2 . b)(3 . c)))
> +(test (list 'a 'b 'c) hash-range #hasheq((1 . a)(2 . b)(3 . c)))
> +(test (list (cons 1 'a) (cons 2 'b) (cons 3 'c)) hash->list #hasheq((1 . a)(2 . b)(3 . c)))
> +
> +(err/rt-test (hash-set*! im-t 1 2) exn:fail?)
> +(err/rt-test (hash-set* (make-hasheq null) 1 2) exn:fail?)
> +(err/rt-test (hash-set* im-t 1 2 3) exn:fail?)
> +(err/rt-test (hash-set*! (make-hasheq null) 1 2 3) exn:fail?)
> +
> +(test #t equal? (hash-set* (hasheq 1 'a 3 'b)) (hasheq 1 'a 3 'b))
> +(test #t equal? (hasheq 1 2 3 4)
> +      (hash-set* (hasheq 1 'a 3 'b)
> +                 1 (gensym)
> +                 1 2
> +                 3 (gensym)
> +                 3 4))
> +(test #t equal? (make-hasheq (list (cons 1 'a) (cons 3 'b)))
> +      (let ([ht (make-hasheq (list (cons 1 'a) (cons 3 'b)))])
> +        (hash-set*! ht)
> +        ht))
> +(test #t equal? (make-hasheq (list (cons 1 2) (cons 3 'b)))
> +      (let ([ht (make-hasheq (list (cons 1 'a) (cons 3 'b)))])
> +        (hash-set*! ht
> +                    1 2)
> +        ht))
> +(test #t equal? (make-hasheq (list (cons 1 2) (cons 3 4)))
> +      (let ([ht (make-hasheq (list (cons 1 'a) (cons 3 'b)))])
> +        (hash-set*! ht
> +                    1 (gensym)
> +                    1 2
> +                    3 (gensym)
> +                    3 4)
> +        ht))
> +
>  (arity-test make-immutable-hash 1 1)
>  (arity-test make-immutable-hasheq 1 1)
> +(arity-test hash-domain 1 1)
> +(arity-test hash-range 1 1)
>  (arity-test hash-count 1 1)
>  (arity-test hash-ref 2 3)
>  (arity-test hash-set! 3 3)
>
> collects/tests/unstable/hash.rkt
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> --- OLD/collects/tests/unstable/hash.rkt
> +++ NEW/collects/tests/unstable/hash.rkt
> @@ -4,10 +4,6 @@
>
>  (run-tests
>  (test-suite "hash.ss"
> -   (test-suite "hash-equal?"
> -     (test (check-true (hash-equal? #hash())))
> -     (test (check-false (hash-equal? #hasheq())))
> -     (test (check-false (hash-equal? #hasheqv()))))
>    (test-suite "hash-ref/check"
>      (test-ok (check-equal? (hash-ref/check #hash([1 . one] [2 . two]) 1)
>                             'one))
> @@ -31,14 +27,6 @@
>               (check-equal? (hash-ref/failure #hash([1 . one] [2 . two]) 3 f)
>                             8)
>               (check-equal? x 8)))
> -   (test-suite "hash-has-key?"
> -     (test-ok (check-equal? (hash-has-key? #hash([1 . one] [2 . two]) 1) #t))
> -     (test-ok (check-equal? (hash-has-key? #hash([1 . one] [2 . two]) 3) #f)))
> -   (test-suite "hash-domain"
> -     (test-ok (check-equal? (hash-domain #hash([1 . one] [2 . two])) '(1 2))))
> -   (test-suite "hash-range"
> -     (test-ok (check-equal? (hash-range #hash([1 . one] [2 . two]))
> -                            '(one two))))
>    (test-suite "hash-union"
>      (test-ok (hash-union #hash([1 . one] [2 . two])
>                           #hash([3 . three] [4 . four]))
>
> collects/unstable/hash.rkt
> ~~~~~~~~~~~~~~~~~~~~~~~~~~
> --- OLD/collects/unstable/hash.rkt
> +++ NEW/collects/unstable/hash.rkt
> @@ -14,12 +14,6 @@
>  (define (hash-ref/failure table key failure)
>   (hash-ref table key (lambda () (failure))))
>
> -(define (hash-domain table)
> -  (for/list ([i (in-hash-keys table)]) i))
> -
> -(define (hash-range table)
> -  (for/list ([i (in-hash-values table)]) i))
> -
>  (define ((hash-duplicate-error name) key value1 value2)
>   (error name "duplicate values for key ~e: ~e and ~e" key value1 value2))
>
> @@ -55,8 +49,6 @@
>   (->d ([table hash?] [key any/c]) ()
>        #:pre-cond (hash-has-key? table key)
>        [_ any/c])]
> - [hash-domain (-> hash? list?)]
> - [hash-range (-> hash? list?)]
>  [hash-union (->* [(and/c hash? immutable?)]
>                   [#:combine
>                    (-> any/c any/c any/c)
>
> collects/unstable/scribblings/hash.scrbl
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> --- OLD/collects/unstable/scribblings/hash.scrbl
> +++ NEW/collects/unstable/scribblings/hash.scrbl
> @@ -67,57 +67,6 @@ applying @scheme[f] (in tail position) if @scheme[h] has no entry for
>
>  }
>
> - at section{Hash Table Accessors}
> -
> - at defproc[(hash-equal? [h hash?]) boolean?]{
> -
> -Reports whether @scheme[h] maps keys according to @scheme[equal?].
> -
> - at defexamples[
> -#:eval (eval/require 'unstable/hash)
> -(hash-equal? #hash())
> -(hash-equal? #hasheq())
> -(hash-equal? #hasheqv())
> -]
> -
> -}
> -
> - at defproc[(hash-has-key? [h hash?] [k any/c]) boolean?]{
> -
> -Reports whether @scheme[h] has an entry for @scheme[k].  This function is
> -re-exported from @schememodname[scheme/base].  In versions of Racket before
> - at scheme[hash-has-key?] was implemented, this module provides its own definition.
> -
> - at defexamples[
> -#:eval (eval/require 'unstable/hash)
> -(hash-has-key? (make-immutable-hash '([1 . one] [2 . two] [3 . three])) 2)
> -(hash-has-key? (make-immutable-hash '([1 . one] [2 . two] [3 . three])) 4)
> -]
> -
> -}
> -
> - at defproc[(hash-domain [h hash?]) list?]{
> -
> -Produces the domain of a hash table as a list of keys.
> -
> - at defexamples[
> -#:eval (eval/require 'unstable/hash)
> -(hash-domain (make-immutable-hash '([1 . one] [2 . two] [3 . three])))
> -]
> -
> -}
> -
> - at defproc[(hash-range [h hash?]) list?]{
> -
> -Produces the range of a hash table as a list of values.
> -
> - at defexamples[
> -#:eval (eval/require 'unstable/hash)
> -(hash-range (make-immutable-hash '([1 . one] [2 . two] [3 . three])))
> -]
> -
> -}
> -
>  @section{Hash Table Combinations}
>
>  @defproc[(hash-union [h0 (and/c hash? hash-can-functional-set?)]
>



-- 
Jay McCarthy <jay at cs.byu.edu>
Assistant Professor / Brigham Young University
http://teammccarthy.org/jay

"The glory of God is Intelligence" - D&C 93


Posted on the dev mailing list.