From 13b6b6943b8f6ac25f074731bc995d46f7aeced2 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 7 Feb 2019 11:08:03 -0800 Subject: [PATCH] committing @mflatt hashtable-cells pull request original commit: 1900a7ef534366a4311a714cf56b9c60657ba0a1 --- LOG | 5 + csug/objects.stex | 92 ++++- mats/hash.ms | 597 +++++++++++++------------------ mats/patch-compile-0-t-f-f | 36 +- mats/patch-interpret-3-f-f-f | 4 +- mats/patch-interpret-3-f-t-f | 4 +- mats/root-experr-compile-0-f-f-f | 19 +- release_notes/release_notes.stex | 8 + s/newhash.ss | 264 +++++++++----- s/primdata.ss | 10 +- 10 files changed, 574 insertions(+), 465 deletions(-) diff --git a/LOG b/LOG index b9cb5aae14..e06c729446 100644 --- a/LOG +++ b/LOG @@ -1056,3 +1056,8 @@ cmacros.ss, cpnanopass.ss, gc.c, 7.ms +- add hashtable-cells and add a size argument to hashtable-keys, + hashtable-values, and hashtable-entries + newhash.ss, primdata.ss, + hash.ms, root-experr*, patch*, + objects.stex, release_notes.stex diff --git a/csug/objects.stex b/csug/objects.stex index ec65e46304..06776c2852 100644 --- a/csug/objects.stex +++ b/csug/objects.stex @@ -1841,9 +1841,36 @@ cell ;=> (#(a b c) . 3) (hashtable-ref ht v 0) ;=> 4 \endschemedisplay +%---------------------------------------------------------------------------- +\entryheader +\formdef{hashtable-keys}{\categoryprocedure}{(hashtable-keys \var{hashtable})} +\formdef{hashtable-keys}{\categoryprocedure}{(hashtable-keys \var{hashtable} \var{size})} +\returns a vector containing the keys in \var{hashtable} +\listlibraries +\endentryheader + +\noindent +Identitcal to the Revised$^6$ Report counterpart, but allowing an optional +\var{size} argument. +If \var{size} is specified, then it must be an exact, nonnegative integer, and the +result vector contains no more than \var{size} elements. +Different calls to \scheme{hashtable-keys} +with a \var{size} less than \scheme{(hashtable-size \var{hashtable})} +may return different subsets of \var{hashtable}'s keys. + +\schemedisplay +(define ht (make-eq-hashtable)) +(hashtable-set! ht 'a "one") +(hashtable-set! ht 'b "two") +(hashtable-set! ht 'c "three") +(hashtable-keys ht) ;=> #(a b c) \var{or any permutation} +(hashtable-keys ht 1) ;=> #(a) \var{or} #(b) \var{or} #(c) +\endschemedisplay + %---------------------------------------------------------------------------- \entryheader \formdef{hashtable-values}{\categoryprocedure}{(hashtable-values \var{hashtable})} +\formdef{hashtable-values}{\categoryprocedure}{(hashtable-values \var{hashtable} \var{size})} \returns a vector containing the values in \var{hashtable} \listlibraries \endentryheader @@ -1852,6 +1879,11 @@ cell ;=> (#(a b c) . 3) Each value is the value of one of the keys in \var{hashtable}. Duplicate values are not removed. The values may appear in any order in the returned vector. +If \var{size} is specified, then it must be an exact, nonnegative integer, and the +result vector contains no more than \var{size} elements. +Different calls to \scheme{hashtable-values} +with a \var{size} less than \scheme{(hashtable-size \var{hashtable})} +may return different subsets of \var{hashtable}'s values. \schemedisplay (define ht (make-eq-hashtable)) @@ -1860,19 +1892,65 @@ The values may appear in any order in the returned vector. (hashtable-set! ht p1 "one") (hashtable-set! ht p2 "two") (hashtable-set! ht 'q "two") -(hashtable-values ht) ;=> #("one" "two" "two") +(hashtable-values ht) ;=> #("one" "two" "two") \var{or any permutation} +(hashtable-values ht 1) ;=> #("one") \var{or} #("two") \endschemedisplay -This procedure is equivalent to: +This procedure is equivalent to calling \scheme{hashtable-entries} and returning only +the second result, but it is more efficient since the separate vector of keys need +not be created. + +%---------------------------------------------------------------------------- +\entryheader +\formdef{hashtable-entries}{\categoryprocedure}{(hashtable-entries \var{hashtable})} +\formdef{hashtable-entries}{\categoryprocedure}{(hashtable-entries \var{hashtable} \var{size})} +\returns two vectors containing the keys and values in \var{hashtable} +\listlibraries +\endentryheader + +\noindent +Identitcal to the Revised$^6$ Report counterpart, but allowing an optional +\var{size} argument. +If \var{size} is specified, then it must be an exact, nonnegative integer, and the +result vectors contain no more than \var{size} elements. +Different calls to \scheme{hashtable-entries} +with a \var{size} less than \scheme{(hashtable-size \var{hashtable})} +may return different subsets of \var{hashtable}'s entries. \schemedisplay -(lambda (ht) - (let-values ([(keys values) (hashtable-entries ht)]) - values)) +(define ht (make-eq-hashtable)) +(hashtable-set! ht 'a "one") +(hashtable-set! ht 'b "two") +(hashtable-entries ht) ;=> #(a b) #("one" "two") \var{or the other permutation} +(hashtable-entries ht 1) ;=> #(a) #("one") \var{or} #(b) #("two") \endschemedisplay -but more efficient since the separate vector of keys need -not be created. +%---------------------------------------------------------------------------- +\entryheader +\formdef{hashtable-cells}{\categoryprocedure}{(hashtable-cells \var{hashtable})} +\formdef{hashtable-cells}{\categoryprocedure}{(hashtable-cells \var{hashtable} \var{size})} +\returns a vector of up to \var{size} elements containing the cells of \var{hashtable} +\listlibraries +\endentryheader + +\noindent +Each element of the result vector is the value of one of the cells in \var{hashtable}. +The cells may appear in any order in the returned vector. +If \var{size} is specified, then it must be an exact, nonnegative integer, and the +result vector contains no more than \var{size} cells. +If \var{size} is not specified, then the result vector has \scheme{(hashtable-size \var{hashtable})} elements. +Different calls to \scheme{hashtable-cells} +with a \var{size} less than \scheme{(hashtable-size \var{hashtable})} +may return different subsets of \var{hashtable}'s cells. + +\schemedisplay +(define ht (make-eqv-hashtable)) +(hashtable-set! ht 1 'one) +(hashtable-set! ht 2 'two) +(hashtable-cells ht) ;=> #((1 . one) (2 . two)) \var{or} #((2 . two) (1 . one)) +(hashtable-cells ht 1) ;=> #((1 . one)) \var{or} #((2 . two)) +(hashtable-cells ht 0) ;=> #() +\endschemedisplay %---------------------------------------------------------------------------- \entryheader diff --git a/mats/hash.ms b/mats/hash.ms index 38211f89b7..d7663a2106 100644 --- a/mats/hash.ms +++ b/mats/hash.ms @@ -291,17 +291,77 @@ (each-in? v1 v2) (each-in? v2 v1))))) -(define $equal-entries? - (lambda (keys1 vals1 keys2 vals2) - (and - (same-elements? keys1 keys2) - (same-elements? vals1 vals2)))) +(define equal-entries? + (lambda (ht keys vals) + (define-syntax same-entries? + (syntax-rules () + [(_ e1 keys2 vals2) + (let-values ([(keys1 vals1) e1]) + (and + (same-elements? keys1 keys2) + (same-elements? vals1 vals2)))])) -(define-syntax equal-entries? - (syntax-rules () - [(_ e1 e2 e3) - (let-values ([(keys1 vals1) e1]) - ($equal-entries? keys1 vals1 e2 e3))])) + (and + (same-elements? (hashtable-keys ht) keys) + (same-elements? (hashtable-values ht) vals) + (same-entries? (hashtable-entries ht) keys vals) + (same-elements? (hashtable-cells ht) (vector-map cons keys vals)) + + (same-elements? (r6rs:hashtable-keys ht) keys) + (same-entries? (r6rs:hashtable-entries ht) keys vals) + + ;; Check requested sizes > hash table size + (andmap (lambda (size) + (and + (same-elements? (hashtable-keys ht size) keys) + (same-elements? (hashtable-values ht size) vals) + (same-entries? (hashtable-entries ht size) keys vals) + (same-elements? (hashtable-cells ht size) (vector-map cons keys vals)))) + (list (add1 (hashtable-size ht)) + (expt 2 1000))) + + ;; Make sure request of 0 always works: + (same-elements? (hashtable-keys ht 0) '#()) + (same-elements? (hashtable-values ht 0) '#()) + (same-entries? (hashtable-entries ht 0) '#() '#()) + (same-elements? (hashtable-cells ht 0) '#()) + + (or + (< (hashtable-size ht) 2) + ;; Check request of size 2: + (let ([twos (lambda (v) + (let i-loop ([i 0]) + (cond + [(= i (vector-length v)) + '()] + [else + (let j-loop ([j (add1 i)]) + (cond + [(= j (vector-length v)) + (i-loop (add1 i))] + [else + (cons (vector (vector-ref v i) (vector-ref v j)) + (j-loop (add1 j)))]))])))]) + (let ([keyss (twos keys)] + [valss (twos vals)]) + (and + (let ([got-keys (hashtable-keys ht 2)]) + (ormap (lambda (keys) + (same-elements? got-keys keys)) + keyss)) + (let ([got-vals (hashtable-values ht 2)]) + (ormap (lambda (vals) + (same-elements? got-vals vals)) + valss)) + (let-values ([(got-keys got-vals) (hashtable-entries ht 2)]) + (ormap (lambda (keys vals) + (and (same-elements? got-keys keys) + (same-elements? got-vals vals))) + keyss valss)) + (let ([got-cells (hashtable-cells ht 2)]) + (ormap (lambda (keys vals) + (same-elements? got-cells (vector-map cons keys vals))) + keyss valss))))))))) (mat hashtable-arguments ; make-eq-hashtable @@ -487,23 +547,58 @@ (error? ; wrong argument count (hashtable-keys)) (error? ; wrong argument count - (hashtable-keys $ht 72)) + (hashtable-keys $ht 72 43)) (error? ; not a hashtable (hashtable-keys '(hash . table))) + (error? ; bad size + (hashtable-keys $ht -79)) + (error? ; bad size + (hashtable-keys $ht 'not-an-unsigned-integer)) + (error? ; wrong argument count + (r6rs:hashtable-keys)) + (error? ; wrong argument count + (r6rs:hashtable-keys $ht 72)) + (error? ; not a hashtable + (r6rs:hashtable-keys '(hash . table))) ; hashtable-values (error? ; wrong argument count (hashtable-values)) (error? ; wrong argument count - (hashtable-values $ht 72)) + (hashtable-values $ht 72 43)) (error? ; not a hashtable (hashtable-values '(hash . table))) + (error? ; bad size + (hashtable-values $ht -79)) + (error? ; bad size + (hashtable-values $ht 'not-an-unsigned-integer)) ; hashtable-entries (error? ; wrong argument count (hashtable-entries)) (error? ; wrong argument count - (hashtable-entries $ht 72)) + (hashtable-entries $ht 72 43)) (error? ; not a hashtable (hashtable-entries '(hash . table))) + (error? ; bad size + (hashtable-entries $ht -79)) + (error? ; bad size + (hashtable-entries $ht 'not-an-unsigned-integer)) + (error? ; wrong argument count + (r6rs:hashtable-entries)) + (error? ; wrong argument count + (r6rs:hashtable-entries $ht 72)) + (error? ; not a hashtable + (r6rs:hashtable-entries '(hash . table))) + ; hashtable-cells + (error? ; wrong argument count + (hashtable-cells)) + (error? ; wrong argument count + (hashtable-cells $ht 72 43)) + (error? ; not a hashtable + (hashtable-cells '(hash . table))) + (error? ; bad size + (hashtable-cells $ht -79)) + (error? ; bad size + (hashtable-cells $ht 'not-an-unsigned-integer)) ; hashtable-hash-function (error? ; wrong argument count (hashtable-hash-function)) @@ -916,9 +1011,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (hashtable-set! h 'a 'aval) (void)) (equal? (list @@ -941,9 +1034,7 @@ (hashtable-contains? h 'c)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#(a b c)) - (same-elements? (hashtable-values h) '#(bval cval aval)) - (equal-entries? (hashtable-entries h) '#(b c a) '#(bval cval aval)) + (equal-entries? h '#(b c a) '#(bval cval aval)) #;(same-elements? (list->vector (hashtable-map h cons)) '#((a . aval) (b . bval) (c . cval))) #;(same-elements? (let ([v (make-vector 3)] [i 0]) @@ -960,9 +1051,7 @@ (equal? (hashtable-ref h 'c 'nope) 'cval) (eqv? (hashtable-delete! h 'b) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#(a c)) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#(a c) '#(aval cval)) + (equal-entries? h '#(a c) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -975,9 +1064,7 @@ (eq? (hashtable-hash-function h2) #f) (eq? (hashtable-equivalence-function h2) eq?) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -986,9 +1073,7 @@ (hashtable-ref h 'b #f) (hashtable-ref h 'c 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -996,9 +1081,7 @@ (hashtable-ref h2 'b #f) (hashtable-ref h2 'c 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-update! h 'q (lambda (x) (+ x 1)) @@ -1060,9 +1143,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (hashtable-set! h ka 'aval) (void)) (equal? (list @@ -1085,9 +1166,8 @@ (hashtable-contains? h kc)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#((a) (b) (c))) - (same-elements? (hashtable-values h) '#(bval cval aval)) - (equal-entries? (hashtable-entries h) '#((a) (b) (c)) '#(aval bval cval)) + (equal-entries? h '#((a) (b) (c)) '#(aval bval cval)) + (andmap weak-pair? (vector->list (hashtable-cells h))) #;(same-elements? (list->vector (hashtable-map h cons)) '#(((a) . aval) ((b) . bval) ((c) . cval))) #;(same-elements? (let ([v (make-vector 3)] [i 0]) @@ -1104,9 +1184,7 @@ (equal? (hashtable-ref h kc 'nope) 'cval) (eqv? (hashtable-delete! h kb) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#((a) (c))) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#((a) (c)) '#(aval cval)) + (equal-entries? h '#((a) (c)) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -1117,9 +1195,7 @@ (eq? (hashtable-hash-function h2) #f) (eq? (hashtable-equivalence-function h2) eq?) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -1128,9 +1204,7 @@ (hashtable-ref h kb #f) (hashtable-ref h kc 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -1138,9 +1212,7 @@ (hashtable-ref h2 kb #f) (hashtable-ref h2 kc 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) (eqv? (hashtable-update! h kq (lambda (x) (+ x 1)) @@ -1154,17 +1226,14 @@ (void)) (equal? (hashtable-ref h kq #f) 19) (equal? (hashtable-size h) 1) - (same-elements? (hashtable-keys h) '#((q))) - (same-elements? (hashtable-values h) '#(19)) + (equal-entries? h '#((q)) '#(19)) (eqv? (begin (set! kq (void)) (collect (collect-maximum-generation)) (hashtable-size h)) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) #;(eqv? (hashtable-map h (lambda args (error #f "oops"))) '()) #;(eqv? (hashtable-for-each h (lambda args (error #f "oops"))) (void)) #;(eqv? (hashtable-for-each-cell h (lambda args (error #f "oops"))) (void)) @@ -1178,10 +1247,8 @@ (hashtable-update! h kz list 'frog) (void)) (equal? (hashtable-ref h kz #f) '(frog)) - (same-elements? (hashtable-keys h) (vector ky kz)) - (same-elements? (hashtable-values h) (vector (hashtable-ref h kz #f) 'toad)) (equal-entries? - (hashtable-entries h) + h (vector kz ky) (vector (hashtable-ref h kz #f) 'toad)) (eqv? (hashtable-ref h '(zippo) 'nil) 'nil) @@ -1192,31 +1259,23 @@ (not (hashtable-mutable? h3)) (eq-hashtable-weak? h3) (hashtable-weak? h3))) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-keys h3) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (same-elements? (hashtable-values h3) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) + (equal-entries? h3 '#((a) (c)) '#(aval cval)) (equal? (begin (set! ka (void)) (collect (collect-maximum-generation)) (list (hashtable-size h2) (hashtable-size h3))) '(1 1)) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-keys h3) '#((c))) - (same-elements? (hashtable-values h2) '#(cval)) - (same-elements? (hashtable-values h3) '#(cval)) - (equal-entries? (hashtable-entries h2) '#((c)) '#(cval)) - (equal-entries? (hashtable-entries h3) '#((c)) '#(cval)) + (equal-entries? h2 '#((c)) '#(cval)) + (equal-entries? h3 '#((c)) '#(cval)) (eqv? (begin (set! h3 (void)) (collect (collect-maximum-generation)) (hashtable-size h2)) 1) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-values h2) '#(cval)) - (equal-entries? (hashtable-entries h2) '#((c)) '#(cval)) + (equal-entries? h2 '#((c)) '#(cval)) ; test for proper shrinkage (eqv? @@ -1258,7 +1317,7 @@ (hashtable-set! ht wk4 wk2) (collect (collect-maximum-generation)) (and - (same-elements? (hashtable-keys ht) '#((1) (2) (3) (4))) + (equal-entries? ht '#((1) (2) (3) (4)) '#((1) (1) (3) (2))) (equal? (hashtable-ref ht wk1 #f) wk1) (equal? (hashtable-ref ht wk2 #f) wk1) (equal? (hashtable-ref ht wk3 #f) wk3) @@ -1269,12 +1328,12 @@ (set! wk3 #f) (collect (collect-maximum-generation)) (and - (same-elements? (hashtable-keys ht) '#((1) (2) (3) (4))) + (equal-entries? ht '#((1) (2) (3) (4)) '#((1) (1) (3) (2))) (equal? (hashtable-ref ht wk4 #f) '(2)) (begin (set! wk4 #f) (collect (collect-maximum-generation)) - (same-elements? (hashtable-keys ht) '#((1) (2) (3)))))))) + (equal-entries? ht '#((1) (2) (3)) '#((1) (1) (3)))))))) ) (mat ephemeron-eq-hashtable @@ -1296,9 +1355,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (hashtable-set! h ka ka) (void)) (equal? (list @@ -1321,9 +1378,8 @@ (hashtable-contains? h kc)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#((a) (b) (c))) - (same-elements? (hashtable-values h) '#((a) (b) (c))) - (equal-entries? (hashtable-entries h) '#((a) (b) (c)) '#((a) (c) (b))) + (equal-entries? h '#((a) (b) (c)) '#((a) (c) (b))) + (andmap ephemeron-pair? (vector->list (hashtable-cells h))) #;(same-elements? (list->vector (hashtable-map h cons)) '#(((a) . a) ((b) . c) ((c) . b))) #;(same-elements? (let ([v (make-vector 3)] [i 0]) @@ -1340,9 +1396,7 @@ (equal? (hashtable-ref h kc 'nope) '(b)) (eqv? (hashtable-delete! h kb) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#((a) (c))) - (same-elements? (hashtable-values h) '#((a) (b))) - (equal-entries? (hashtable-entries h) '#((a) (c)) '#((a) (b))) + (equal-entries? h '#((a) (c)) '#((a) (b))) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -1353,9 +1407,7 @@ (eq? (hashtable-hash-function h2) #f) (eq? (hashtable-equivalence-function h2) eq?) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#((a) (b))) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#((a) (b))) + (equal-entries? h2 '#((a) (c)) '#((a) (b))) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -1364,9 +1416,7 @@ (hashtable-ref h kb #f) (hashtable-ref h kc 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -1374,9 +1424,7 @@ (hashtable-ref h2 kb #f) (hashtable-ref h2 kc 'nope)) '(2 (a) #f (b))) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#((a) (b))) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#((a) (b))) + (equal-entries? h2 '#((a) (c)) '#((a) (b))) (eqv? (hashtable-update! h kq (lambda (x) (+ x 1)) @@ -1390,17 +1438,14 @@ (void)) (equal? (hashtable-ref h kq #f) 19) (equal? (hashtable-size h) 1) - (same-elements? (hashtable-keys h) '#((q))) - (same-elements? (hashtable-values h) '#(19)) + (equal-entries? h '#((q)) '#(19)) (eqv? (begin (set! kq (void)) (collect (collect-maximum-generation)) (hashtable-size h)) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) #;(eqv? (hashtable-map h (lambda args (error #f "oops"))) '()) #;(eqv? (hashtable-for-each h (lambda args (error #f "oops"))) (void)) #;(eqv? (hashtable-for-each-cell h (lambda args (error #f "oops"))) (void)) @@ -1414,10 +1459,8 @@ (hashtable-update! h kz list 'frog) (void)) (equal? (hashtable-ref h kz #f) '(frog)) - (same-elements? (hashtable-keys h) (vector ky kz)) - (same-elements? (hashtable-values h) (vector (hashtable-ref h kz #f) 'toad)) (equal-entries? - (hashtable-entries h) + h (vector kz ky) (vector (hashtable-ref h kz #f) 'toad)) (eqv? (hashtable-ref h '(zippo) 'nil) 'nil) @@ -1428,31 +1471,23 @@ (not (hashtable-mutable? h3)) (eq-hashtable-ephemeron? h3) (hashtable-ephemeron? h3))) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-keys h3) '#((a) (c))) - (same-elements? (hashtable-values h2) '#((a) (b))) - (same-elements? (hashtable-values h3) '#((a) (b))) + (equal-entries? h2 '#((a) (c)) '#((a) (b))) + (equal-entries? h3 '#((a) (c)) '#((a) (b))) (equal? (begin (set! ka (void)) (collect (collect-maximum-generation)) (list (hashtable-size h2) (hashtable-size h3))) '(1 1)) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-keys h3) '#((c))) - (same-elements? (hashtable-values h2) '#((b))) - (same-elements? (hashtable-values h3) '#((b))) - (equal-entries? (hashtable-entries h2) '#((c)) '#((b))) - (equal-entries? (hashtable-entries h3) '#((c)) '#((b))) + (equal-entries? h2 '#((c)) '#((b))) + (equal-entries? h3 '#((c)) '#((b))) (eqv? (begin (set! h3 (void)) (collect (collect-maximum-generation)) (hashtable-size h2)) 1) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-values h2) '#((b))) - (equal-entries? (hashtable-entries h2) '#((c)) '#((b))) + (equal-entries? h2 '#((c)) '#((b))) ; test for proper shrinkage (eqv? @@ -1494,7 +1529,7 @@ (hashtable-set! ht wk4 wk2) (collect (collect-maximum-generation)) (and - (same-elements? (hashtable-keys ht) '#((1) (2) (3) (4))) + (equal-entries? ht '#((1) (2) (3) (4)) '#((1) (1) (3) (2))) (equal? (hashtable-ref ht wk1 #f) wk1) (equal? (hashtable-ref ht wk2 #f) wk1) (equal? (hashtable-ref ht wk3 #f) wk3) @@ -1505,12 +1540,12 @@ (set! wk3 #f) (collect (collect-maximum-generation)) (and - (same-elements? (hashtable-keys ht) '#((1) (2) (4))) + (equal-entries? ht '#((1) (2) (4)) '#((1) (1) (2))) (equal? (hashtable-ref ht wk4 #f) '(2)) (begin (set! wk4 #f) (collect (collect-maximum-generation)) - (same-elements? (hashtable-keys ht) '#())))))) + (equal-entries? ht '#() '#())))))) ) (mat eq-hashtable-cell @@ -1627,9 +1662,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (eq-hashtable-set! h 'a 'aval) (void)) (equal? (list @@ -1652,17 +1685,13 @@ (eq-hashtable-contains? h 'c)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#(a b c)) - (same-elements? (hashtable-values h) '#(bval cval aval)) - (equal-entries? (hashtable-entries h) '#(b c a) '#(bval cval aval)) + (equal-entries? h '#(b c a) '#(bval cval aval)) (equal? (eq-hashtable-ref h 'a 1) 'aval) (equal? (eq-hashtable-ref h 'b #f) 'bval) (equal? (eq-hashtable-ref h 'c 'nope) 'cval) (eqv? (eq-hashtable-delete! h 'b) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#(a c)) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#(a c) '#(aval cval)) + (equal-entries? h '#(a c) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -1671,9 +1700,7 @@ (not (eq-hashtable-weak? h2)) (not (hashtable-weak? h2)))) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -1682,9 +1709,7 @@ (eq-hashtable-ref h 'b #f) (eq-hashtable-ref h 'c 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -1692,9 +1717,7 @@ (eq-hashtable-ref h2 'b #f) (eq-hashtable-ref h2 'c 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (eq-hashtable-update! h 'q (lambda (x) (+ x 1)) @@ -1771,9 +1794,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (eq-hashtable-set! h ka 'aval) (void)) (equal? (list @@ -1796,17 +1817,14 @@ (eq-hashtable-contains? h kc)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#((a) (b) (c))) - (same-elements? (hashtable-values h) '#(aval bval cval)) - (equal-entries? (hashtable-entries h) '#((a) (b) (c)) '#(aval bval cval)) + (equal-entries? h '#((a) (b) (c)) '#(aval bval cval)) + (andmap weak-pair? (vector->list (hashtable-cells h))) (equal? (eq-hashtable-ref h ka 1) 'aval) (equal? (eq-hashtable-ref h kb #f) 'bval) (equal? (eq-hashtable-ref h kc 'nope) 'cval) (eqv? (eq-hashtable-delete! h kb) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#((a) (c))) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#((a) (c)) '#(aval cval)) + (equal-entries? h '#((a) (c)) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -1815,9 +1833,7 @@ (hashtable-weak? h2) (eq-hashtable-weak? h2))) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -1826,9 +1842,7 @@ (eq-hashtable-ref h kb #f) (eq-hashtable-ref h kc 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -1836,9 +1850,7 @@ (eq-hashtable-ref h2 kb #f) (eq-hashtable-ref h2 kc 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) (eqv? (eq-hashtable-update! h kq (lambda (x) (+ x 1)) @@ -1852,17 +1864,14 @@ (void)) (equal? (eq-hashtable-ref h kq #f) 19) (equal? (hashtable-size h) 1) - (same-elements? (hashtable-keys h) '#((q))) - (same-elements? (hashtable-values h) '#(19)) + (equal-entries? h '#((q)) '#(19)) (eqv? (begin (set! kq (void)) (collect (collect-maximum-generation)) (hashtable-size h)) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (eq-hashtable-ref h ky #f) #f) (eqv? (eq-hashtable-set! h ky 'toad) @@ -1873,10 +1882,8 @@ (eq-hashtable-update! h kz list 'frog) (void)) (equal? (eq-hashtable-ref h kz #f) '(frog)) - (same-elements? (hashtable-keys h) (vector ky kz)) - (same-elements? (hashtable-values h) (vector (eq-hashtable-ref h kz #f) 'toad)) (equal-entries? - (hashtable-entries h) + h (vector kz ky) (vector (eq-hashtable-ref h kz #f) 'toad)) (eqv? (eq-hashtable-ref h '(zippo) 'nil) 'nil) @@ -1887,31 +1894,23 @@ (not (hashtable-mutable? h3)) (eq-hashtable-weak? h3) (hashtable-weak? h3))) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-keys h3) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (same-elements? (hashtable-values h3) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) + (equal-entries? h3 '#((a) (c)) '#(aval cval)) (equal? (begin (set! ka (void)) (collect (collect-maximum-generation)) (list (hashtable-size h2) (hashtable-size h3))) '(1 1)) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-keys h3) '#((c))) - (same-elements? (hashtable-values h2) '#(cval)) - (same-elements? (hashtable-values h3) '#(cval)) - (equal-entries? (hashtable-entries h2) '#((c)) '#(cval)) - (equal-entries? (hashtable-entries h3) '#((c)) '#(cval)) + (equal-entries? h2 '#((c)) '#(cval)) + (equal-entries? h3 '#((c)) '#(cval)) (eqv? (begin (set! h3 (void)) (collect (collect-maximum-generation)) (hashtable-size h2)) 1) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-values h2) '#(cval)) - (equal-entries? (hashtable-entries h2) '#((c)) '#(cval)) + (equal-entries? h2 '#((c)) '#(cval)) ; test for proper shrinkage (eqv? @@ -1961,9 +1960,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (eq-hashtable-set! h ka 'aval) (void)) (equal? (list @@ -1986,17 +1983,14 @@ (eq-hashtable-contains? h kc)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#((a) (b) (c))) - (same-elements? (hashtable-values h) '#(aval bval cval)) - (equal-entries? (hashtable-entries h) '#((a) (b) (c)) '#(aval bval cval)) + (equal-entries? h '#((a) (b) (c)) '#(aval bval cval)) + (andmap ephemeron-pair? (vector->list (hashtable-cells h))) (equal? (eq-hashtable-ref h ka 1) 'aval) (equal? (eq-hashtable-ref h kb #f) 'bval) (equal? (eq-hashtable-ref h kc 'nope) 'cval) (eqv? (eq-hashtable-delete! h kb) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#((a) (c))) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#((a) (c)) '#(aval cval)) + (equal-entries? h '#((a) (c)) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -2005,9 +1999,7 @@ (hashtable-ephemeron? h2) (eq-hashtable-ephemeron? h2))) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -2016,9 +2008,7 @@ (eq-hashtable-ref h kb #f) (eq-hashtable-ref h kc 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -2026,9 +2016,7 @@ (eq-hashtable-ref h2 kb #f) (eq-hashtable-ref h2 kc 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#((a) (c)) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) (eqv? (eq-hashtable-update! h kq (lambda (x) (+ x 1)) @@ -2042,17 +2030,14 @@ (void)) (equal? (eq-hashtable-ref h kq #f) 19) (equal? (hashtable-size h) 1) - (same-elements? (hashtable-keys h) '#((q))) - (same-elements? (hashtable-values h) '#(19)) + (equal-entries? h '#((q)) '#(19)) (eqv? (begin (set! kq (void)) (collect (collect-maximum-generation)) (hashtable-size h)) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (eq-hashtable-ref h ky #f) #f) (eqv? (eq-hashtable-set! h ky 'toad) @@ -2063,10 +2048,8 @@ (eq-hashtable-update! h kz list 'frog) (void)) (equal? (eq-hashtable-ref h kz #f) '(frog)) - (same-elements? (hashtable-keys h) (vector ky kz)) - (same-elements? (hashtable-values h) (vector (eq-hashtable-ref h kz #f) 'toad)) (equal-entries? - (hashtable-entries h) + h (vector kz ky) (vector (eq-hashtable-ref h kz #f) 'toad)) (eqv? (eq-hashtable-ref h '(zippo) 'nil) 'nil) @@ -2077,31 +2060,23 @@ (not (hashtable-mutable? h3)) (eq-hashtable-ephemeron? h3) (hashtable-ephemeron? h3))) - (same-elements? (hashtable-keys h2) '#((a) (c))) - (same-elements? (hashtable-keys h3) '#((a) (c))) - (same-elements? (hashtable-values h2) '#(aval cval)) - (same-elements? (hashtable-values h3) '#(aval cval)) + (equal-entries? h2 '#((a) (c)) '#(aval cval)) + (equal-entries? h3 '#((a) (c)) '#(aval cval)) (equal? (begin (set! ka (void)) (collect (collect-maximum-generation)) (list (hashtable-size h2) (hashtable-size h3))) '(1 1)) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-keys h3) '#((c))) - (same-elements? (hashtable-values h2) '#(cval)) - (same-elements? (hashtable-values h3) '#(cval)) - (equal-entries? (hashtable-entries h2) '#((c)) '#(cval)) - (equal-entries? (hashtable-entries h3) '#((c)) '#(cval)) + (equal-entries? h2 '#((c)) '#(cval)) + (equal-entries? h3 '#((c)) '#(cval)) (eqv? (begin (set! h3 (void)) (collect (collect-maximum-generation)) (hashtable-size h2)) 1) - (same-elements? (hashtable-keys h2) '#((c))) - (same-elements? (hashtable-values h2) '#(cval)) - (equal-entries? (hashtable-entries h2) '#((c)) '#(cval)) + (equal-entries? h2 '#((c)) '#(cval)) ; test for proper shrinkage (eqv? @@ -2305,9 +2280,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eqv?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (hashtable-set! h 'a 'aval) (void)) (equal? (list @@ -2330,9 +2303,7 @@ (hashtable-contains? h 'c)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#(a 3.4 c)) - (same-elements? (hashtable-values h) '#(bval cval aval)) - (equal-entries? (hashtable-entries h) '#(3.4 c a) '#(bval cval aval)) + (equal-entries? h '#(3.4 c a) '#(bval cval aval)) #;(same-elements? (list->vector (hashtable-map h cons)) '#((a . aval) (3.4 . bval) (c . cval))) #;(same-elements? (let ([v (make-vector 3)] [i 0]) @@ -2349,9 +2320,7 @@ (equal? (hashtable-ref h 'c 'nope) 'cval) (eqv? (hashtable-delete! h 3.4) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#(a c)) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#(a c) '#(aval cval)) + (equal-entries? h '#(a c) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -2361,9 +2330,7 @@ (eq? (hashtable-hash-function h2) #f) (eq? (hashtable-equivalence-function h2) eqv?) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -2372,9 +2339,7 @@ (hashtable-ref h 3.4 #f) (hashtable-ref h 'c 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -2382,9 +2347,7 @@ (hashtable-ref h2 3.4 #f) (hashtable-ref h2 'c 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-update! h 'q (lambda (x) (+ x 1)) @@ -2448,9 +2411,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eqv?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (hashtable-set! h ka 'aval) (void)) (equal? (list @@ -2512,9 +2473,7 @@ (hashtable-contains? h ko)) '(#t #t #t #t #t #t)) (equal? (hashtable-size h) 6) - (same-elements? (hashtable-keys h) `#((a) (b) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h) '#(aval bval cval mval nval oval)) - (equal-entries? (hashtable-entries h) `#((a) (b) (c) -5.75 17 ,ko) '#(aval bval cval mval nval oval)) + (equal-entries? h `#((a) (b) (c) -5.75 17 ,ko) '#(aval bval cval mval nval oval)) #;(same-elements? (list->vector (hashtable-map h cons)) `#(((a) . aval) ((b) . bval) ((c) . cval) (-5.75 . mval) (17 . nval) (,ko . oval))) @@ -2536,9 +2495,7 @@ (eq? (hashtable-ref h (+ (most-positive-fixnum) 7 -2) 'ugh) 'oval) (eqv? (hashtable-delete! h kb) (void)) (equal? (hashtable-size h) 5) - (same-elements? (hashtable-keys h) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h) '#(aval cval mval nval oval)) - (equal-entries? (hashtable-entries h) `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -2547,9 +2504,7 @@ (eq? (hashtable-hash-function h2) #f) (eq? (hashtable-equivalence-function h2) eqv?) (equal? (hashtable-size h2) 5) - (same-elements? (hashtable-keys h) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h) '#(aval cval mval nval oval)) - (equal-entries? (hashtable-entries h) `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -2561,9 +2516,7 @@ (hashtable-ref h kn 'nope) (hashtable-ref h ko 'nope)) '(0 1 #f nope nope nope nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -2574,9 +2527,7 @@ (hashtable-ref h2 (- (+ kn 1) 1) 'nope) (hashtable-ref h2 (- (+ ko 1) 1) 'nope)) '(5 aval #f cval mval nval oval)) - (same-elements? (hashtable-keys h2) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h2) '#(aval cval mval nval oval)) - (equal-entries? (hashtable-entries h2) `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h2 `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (eqv? (hashtable-update! h kq (lambda (x) (+ x 1)) @@ -2590,16 +2541,14 @@ (void)) (equal? (hashtable-ref h kq #f) 19) (equal? (hashtable-size h) 1) - (same-elements? (hashtable-keys h) '#((q))) + (equal-entries? h '#((q)) '#(19)) (eqv? (begin (set! kq (void)) (collect (collect-maximum-generation)) (hashtable-size h)) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (hashtable-ref h ky #f) #f) (eqv? (hashtable-set! h ky 'toad) @@ -2610,10 +2559,8 @@ (hashtable-update! h kz list 'frog) (void)) (equal? (hashtable-ref h kz #f) '(frog)) - (same-elements? (hashtable-keys h) (vector ky kz)) - (same-elements? (hashtable-values h) (vector (hashtable-ref h kz #f) 'toad)) (equal-entries? - (hashtable-entries h) + h (vector kz ky) (vector (hashtable-ref h kz #f) 'toad)) (eqv? (hashtable-ref h '(zippo) 'nil) 'nil) @@ -2622,8 +2569,8 @@ (and (hashtable? h3) (not (hashtable-mutable? h3)) (hashtable-weak? h3))) - (same-elements? (hashtable-keys h2) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-keys h3) `#((a) (c) -5.75 17 ,ko)) + (equal-entries? h2 `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h3 `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (equal? (begin (set! ka (void)) @@ -2633,21 +2580,15 @@ (collect (collect-maximum-generation)) (list (hashtable-size h2) (hashtable-size h3))) '(4 4)) - (same-elements? (hashtable-keys h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5))) - (same-elements? (hashtable-keys h3) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5))) - (same-elements? (hashtable-values h2) '#(cval mval nval oval)) - (same-elements? (hashtable-values h3) '#(cval mval nval oval)) - (equal-entries? (hashtable-entries h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) - (equal-entries? (hashtable-entries h3) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) + (equal-entries? h2 `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) + (equal-entries? h3 `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) (eqv? (begin (set! h3 (void)) (collect (collect-maximum-generation)) (hashtable-size h2)) 4) - (same-elements? (hashtable-keys h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5))) - (same-elements? (hashtable-values h2) '#(cval mval nval oval)) - (equal-entries? (hashtable-entries h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) + (equal-entries? h2 `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) ; test for proper shrinkage (equal? @@ -2700,9 +2641,7 @@ (eq? (hashtable-hash-function h) #f) (eq? (hashtable-equivalence-function h) eqv?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (hashtable-set! h ka 'aval) (void)) (equal? (list @@ -2764,9 +2703,7 @@ (hashtable-contains? h ko)) '(#t #t #t #t #t #t)) (equal? (hashtable-size h) 6) - (same-elements? (hashtable-keys h) `#((a) (b) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h) '#(aval bval cval mval nval oval)) - (equal-entries? (hashtable-entries h) `#((a) (b) (c) -5.75 17 ,ko) '#(aval bval cval mval nval oval)) + (equal-entries? h `#((a) (b) (c) -5.75 17 ,ko) '#(aval bval cval mval nval oval)) #;(same-elements? (list->vector (hashtable-map h cons)) `#(((a) . aval) ((b) . bval) ((c) . cval) (-5.75 . mval) (17 . nval) (,ko . oval))) @@ -2788,9 +2725,7 @@ (eq? (hashtable-ref h (+ (most-positive-fixnum) 7 -2) 'ugh) 'oval) (eqv? (hashtable-delete! h kb) (void)) (equal? (hashtable-size h) 5) - (same-elements? (hashtable-keys h) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h) '#(aval cval mval nval oval)) - (equal-entries? (hashtable-entries h) `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -2799,9 +2734,7 @@ (eq? (hashtable-hash-function h2) #f) (eq? (hashtable-equivalence-function h2) eqv?) (equal? (hashtable-size h2) 5) - (same-elements? (hashtable-keys h) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h) '#(aval cval mval nval oval)) - (equal-entries? (hashtable-entries h) `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -2813,9 +2746,7 @@ (hashtable-ref h kn 'nope) (hashtable-ref h ko 'nope)) '(0 1 #f nope nope nope nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -2826,9 +2757,7 @@ (hashtable-ref h2 (- (+ kn 1) 1) 'nope) (hashtable-ref h2 (- (+ ko 1) 1) 'nope)) '(5 aval #f cval mval nval oval)) - (same-elements? (hashtable-keys h2) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-values h2) '#(aval cval mval nval oval)) - (equal-entries? (hashtable-entries h2) `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h2 `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (eqv? (hashtable-update! h kq (lambda (x) (+ x 1)) @@ -2842,16 +2771,14 @@ (void)) (equal? (hashtable-ref h kq #f) 19) (equal? (hashtable-size h) 1) - (same-elements? (hashtable-keys h) '#((q))) + (equal-entries? h '#((q)) '#(19)) (eqv? (begin (set! kq (void)) (collect (collect-maximum-generation)) (hashtable-size h)) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (hashtable-ref h ky #f) #f) (eqv? (hashtable-set! h ky 'toad) @@ -2862,10 +2789,8 @@ (hashtable-update! h kz list 'frog) (void)) (equal? (hashtable-ref h kz #f) '(frog)) - (same-elements? (hashtable-keys h) (vector ky kz)) - (same-elements? (hashtable-values h) (vector (hashtable-ref h kz #f) 'toad)) (equal-entries? - (hashtable-entries h) + h (vector kz ky) (vector (hashtable-ref h kz #f) 'toad)) (eqv? (hashtable-ref h '(zippo) 'nil) 'nil) @@ -2874,8 +2799,8 @@ (and (hashtable? h3) (not (hashtable-mutable? h3)) (hashtable-ephemeron? h3))) - (same-elements? (hashtable-keys h2) `#((a) (c) -5.75 17 ,ko)) - (same-elements? (hashtable-keys h3) `#((a) (c) -5.75 17 ,ko)) + (equal-entries? h2 `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) + (equal-entries? h3 `#((a) (c) -5.75 17 ,ko) '#(aval cval mval nval oval)) (equal? (begin (set! ka (void)) @@ -2885,21 +2810,15 @@ (collect (collect-maximum-generation)) (list (hashtable-size h2) (hashtable-size h3))) '(4 4)) - (same-elements? (hashtable-keys h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5))) - (same-elements? (hashtable-keys h3) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5))) - (same-elements? (hashtable-values h2) '#(cval mval nval oval)) - (same-elements? (hashtable-values h3) '#(cval mval nval oval)) - (equal-entries? (hashtable-entries h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) - (equal-entries? (hashtable-entries h3) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) + (equal-entries? h2 `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) + (equal-entries? h3 `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) (eqv? (begin (set! h3 (void)) (collect (collect-maximum-generation)) (hashtable-size h2)) 4) - (same-elements? (hashtable-keys h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5))) - (same-elements? (hashtable-values h2) '#(cval mval nval oval)) - (equal-entries? (hashtable-entries h2) `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) + (equal-entries? h2 `#((c) -5.75 17 ,(+ (most-positive-fixnum) 5)) '#(cval mval nval oval)) ; test for proper shrinkage (equal? @@ -3219,9 +3138,7 @@ (eq? (hashtable-hash-function h) symbol-hash) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (hashtable-set! h 'a 'aval) (void)) (equal? (list @@ -3244,9 +3161,7 @@ (hashtable-contains? h 'c)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#(a b c)) - (same-elements? (hashtable-values h) '#(bval cval aval)) - (equal-entries? (hashtable-entries h) '#(b c a) '#(bval cval aval)) + (equal-entries? h '#(b c a) '#(bval cval aval)) #;(same-elements? (list->vector (hashtable-map h cons)) '#((a . aval) (b . bval) (c . cval))) #;(same-elements? (let ([v (make-vector 3)] [i 0]) @@ -3263,9 +3178,7 @@ (equal? (hashtable-ref h 'c 'nope) 'cval) (eqv? (hashtable-delete! h 'b) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#(a c)) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#(a c) '#(aval cval)) + (equal-entries? h '#(a c) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -3277,9 +3190,7 @@ (eq? (hashtable-hash-function h2) symbol-hash) (eq? (hashtable-equivalence-function h2) eq?) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -3288,9 +3199,7 @@ (hashtable-ref h 'b #f) (hashtable-ref h 'c 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -3298,9 +3207,7 @@ (hashtable-ref h2 'b #f) (hashtable-ref h2 'c 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-update! h 'q (lambda (x) (+ x 1)) @@ -3354,9 +3261,7 @@ (eq? (hashtable-hash-function h) symbol-hash) (eq? (hashtable-equivalence-function h) eq?) (equal? (hashtable-size h) 0) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (eqv? (symbol-hashtable-set! h 'a 'aval) (void)) (equal? (list @@ -3379,9 +3284,7 @@ (symbol-hashtable-contains? h 'c)) '(#t #t #t)) (equal? (hashtable-size h) 3) - (same-elements? (hashtable-keys h) '#(a b c)) - (same-elements? (hashtable-values h) '#(bval cval aval)) - (equal-entries? (hashtable-entries h) '#(b c a) '#(bval cval aval)) + (equal-entries? h '#(b c a) '#(bval cval aval)) #;(same-elements? (list->vector (hashtable-map h cons)) '#((a . aval) (b . bval) (c . cval))) #;(same-elements? (let ([v (make-vector 3)] [i 0]) @@ -3398,9 +3301,7 @@ (equal? (symbol-hashtable-ref h 'c 'nope) 'cval) (eqv? (symbol-hashtable-delete! h 'b) (void)) (equal? (hashtable-size h) 2) - (same-elements? (hashtable-keys h) '#(a c)) - (same-elements? (hashtable-values h) '#(aval cval)) - (equal-entries? (hashtable-entries h) '#(a c) '#(aval cval)) + (equal-entries? h '#(a c) '#(aval cval)) (begin (define h2 (hashtable-copy h #t)) (and (hashtable? h2) @@ -3412,9 +3313,7 @@ (eq? (hashtable-hash-function h2) symbol-hash) (eq? (hashtable-equivalence-function h2) eq?) (equal? (hashtable-size h2) 2) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (hashtable-clear! h 4) (void)) (equal? (list @@ -3423,9 +3322,7 @@ (symbol-hashtable-ref h 'b #f) (symbol-hashtable-ref h 'c 'nope)) '(0 1 #f nope)) - (same-elements? (hashtable-keys h) '#()) - (same-elements? (hashtable-values h) '#()) - (equal-entries? (hashtable-entries h) '#() '#()) + (equal-entries? h '#() '#()) (equal? (list (hashtable-size h2) @@ -3433,9 +3330,7 @@ (symbol-hashtable-ref h2 'b #f) (symbol-hashtable-ref h2 'c 'nope)) '(2 aval #f cval)) - (same-elements? (hashtable-keys h2) '#(a c)) - (same-elements? (hashtable-values h2) '#(aval cval)) - (equal-entries? (hashtable-entries h2) '#(a c) '#(aval cval)) + (equal-entries? h2 '#(a c) '#(aval cval)) (eqv? (symbol-hashtable-update! h 'q (lambda (x) (+ x 1)) @@ -3538,9 +3433,7 @@ (not (hashtable-ephemeron? $ght)) (eqv? (hashtable-size $ght) (vector-length $ght-keys1)) (eqv? (#%$hashtable-veclen $ght) 8) - (same-elements? (hashtable-keys $ght) $ght-keys1) - (same-elements? (hashtable-values $ght) $ght-vals1) - (equal-entries? (hashtable-entries $ght) $ght-keys1 $ght-vals1) + (equal-entries? $ght $ght-keys1 $ght-vals1) (begin (define $ght-keys2 '#((a . b) (1 . 2) 3/4 3.4 3.5 1e23 #e1e50 1+1i 3+3.2i -15 #e1e-50 #1=(a . #1#) (#2=(#2# b c)))) (define $ght-vals2 '#(a b c d e f g h i j k l m)) @@ -3550,9 +3443,7 @@ $ght-vals2) (eq? (hashtable-size $ght) (+ (vector-length $ght-keys1) (vector-length $ght-keys2)))) (> (#%$hashtable-veclen $ght) 8) - (same-elements? (hashtable-keys $ght) ($vector-append $ght-keys1 $ght-keys2)) - (same-elements? (hashtable-values $ght) ($vector-append $ght-vals1 $ght-vals2)) - (equal-entries? (hashtable-entries $ght) ($vector-append $ght-keys1 $ght-keys2) ($vector-append $ght-vals1 $ght-vals2)) + (equal-entries? $ght ($vector-append $ght-keys1 $ght-keys2) ($vector-append $ght-vals1 $ght-vals2)) #;(same-elements? (list->vector (hashtable-map $ght cons)) (vector-map cons ($vector-append $ght-keys1 $ght-keys2) ($vector-append $ght-vals1 $ght-vals2))) @@ -3607,29 +3498,21 @@ (lambda (k) (hashtable-delete! $ght k)) $ght-keys1) #t) - (same-elements? (hashtable-keys $ght) $ght-keys2) - (same-elements? (hashtable-values $ght) $ght-vals2) - (equal-entries? (hashtable-entries $ght) $ght-keys2 $ght-vals2) + (equal-entries? $ght $ght-keys2 $ght-vals2) (eqv? (hashtable-size $ght) (vector-length $ght-keys2)) (begin (vector-for-each (lambda (k) (hashtable-delete! $ght k)) $ght-keys2) #t) - (same-elements? (hashtable-keys $ght) '#()) - (same-elements? (hashtable-values $ght) '#()) - (equal-entries? (hashtable-entries $ght) '#() '#()) + (equal-entries? $ght '#() '#()) (eqv? (hashtable-size $ght) 0) (eqv? (#%$hashtable-veclen $ght) 8) ; make sure copies are unaffected by deletions (eq? (hashtable-size $ght2) (+ (vector-length $ght-keys1) (vector-length $ght-keys2))) - (same-elements? (hashtable-keys $ght2) ($vector-append $ght-keys1 $ght-keys2)) - (same-elements? (hashtable-values $ght2) ($vector-append $ght-vals1 $ght-vals2)) - (equal-entries? (hashtable-entries $ght2) ($vector-append $ght-keys1 $ght-keys2) ($vector-append $ght-vals1 $ght-vals2)) + (equal-entries? $ght2 ($vector-append $ght-keys1 $ght-keys2) ($vector-append $ght-vals1 $ght-vals2)) (eq? (hashtable-size $ght3) (+ (vector-length $ght-keys1) (vector-length $ght-keys2))) - (same-elements? (hashtable-keys $ght3) ($vector-append $ght-keys1 $ght-keys2)) - (same-elements? (hashtable-values $ght3) ($vector-append $ght-vals1 $ght-vals2)) - (equal-entries? (hashtable-entries $ght3) ($vector-append $ght-keys1 $ght-keys2) ($vector-append $ght-vals1 $ght-vals2)) + (equal-entries? $ght3 ($vector-append $ght-keys1 $ght-keys2) ($vector-append $ght-vals1 $ght-vals2)) (begin (hashtable-clear! $ght3) (and @@ -3672,9 +3555,7 @@ (set-cdr! a (cons (cdr a) 'vb)) a) '(#vu8(1 2 3) . (bv . vb))) - (same-elements? (hashtable-keys $ght3) '#((a . b) 1e23 #vu8(1 2 3))) - (same-elements? (hashtable-values $ght3) '#(161 14 (bv . vb))) - (equal-entries? (hashtable-entries $ght3) '#((a . b) 1e23 #vu8(1 2 3)) '#(161 14 (bv . vb))) + (equal-entries? $ght3 '#((a . b) 1e23 #vu8(1 2 3)) '#(161 14 (bv . vb))) (let () ; carl's test program, with a few additions (define cov:prof-hash (lambda (V) diff --git a/mats/patch-compile-0-t-f-f b/mats/patch-compile-0-t-f-f index d8b21f4b07..2ffef49a16 100644 --- a/mats/patch-compile-0-t-f-f +++ b/mats/patch-compile-0-t-f-f @@ -4382,14 +4382,31 @@ hash.mo:Expected error in mat hashtable-arguments: "hashtable-clear!: # is not mutable". hash.mo:Expected error in mat hashtable-arguments: "hashtable-clear!: invalid size argument #t". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys)". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys $ht 72 43)". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: not-an-unsigned-integer is not a valid length". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys)". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys $ht 72)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: (hash . table) is not a hashtable". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-values)". -! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-values $ht 72)". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-values $ht 72 43)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: not-an-unsigned-integer is not a valid length". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries)". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries $ht 72 43)". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: not-an-unsigned-integer is not a valid length". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries)". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries $ht 72)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: (hash . table) is not a hashtable". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-cells)". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-cells $ht 72 43)". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: not-an-unsigned-integer is not a valid length". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-hash-function)". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-hash-function $ht $ht)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-hash-function: (hash . table) is not an eq hashtable". @@ -4477,14 +4494,31 @@ hash.mo:Expected error in mat hashtable-arguments: "hashtable-clear!: # is not mutable". hash.mo:Expected error in mat hashtable-arguments: "hashtable-clear!: invalid size argument #t". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: not-an-unsigned-integer is not a valid length". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: (hash . table) is not a hashtable". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: not-an-unsigned-integer is not a valid length". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: not-an-unsigned-integer is not a valid length". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: (hash . table) is not a hashtable". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". +! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: (hash . table) is not a hashtable". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: -79 is not a valid length". + hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: not-an-unsigned-integer is not a valid length". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". ! hash.mo:Expected error in mat hashtable-arguments: "incorrect number of arguments to #". hash.mo:Expected error in mat hashtable-arguments: "hashtable-hash-function: (hash . table) is not an eq hashtable". diff --git a/mats/patch-interpret-3-f-f-f b/mats/patch-interpret-3-f-f-f index 4ab20f3b30..2b50278be7 100644 --- a/mats/patch-interpret-3-f-f-f +++ b/mats/patch-interpret-3-f-f-f @@ -1,5 +1,5 @@ -*** errors-compile-3-f-f-f 2018-05-21 15:41:36.322395203 -0400 ---- errors-interpret-3-f-f-f 2018-05-21 16:32:29.625426575 -0400 +*** errors-compile-3-f-f-f 2018-08-26 16:35:50.000000000 -0600 +--- errors-interpret-3-f-f-f 2018-08-26 17:36:30.000000000 -0600 *************** *** 1,3 **** --- 1,9 ---- diff --git a/mats/patch-interpret-3-f-t-f b/mats/patch-interpret-3-f-t-f index a551f7d0e9..b20a36acb3 100644 --- a/mats/patch-interpret-3-f-t-f +++ b/mats/patch-interpret-3-f-t-f @@ -1,5 +1,5 @@ -*** errors-compile-3-f-t-f 2018-05-21 15:49:28.816472990 -0400 ---- errors-interpret-3-f-t-f 2018-05-21 16:15:47.611381258 -0400 +*** errors-compile-3-f-t-f 2018-08-26 16:45:06.000000000 -0600 +--- errors-interpret-3-f-t-f 2018-08-26 17:13:32.000000000 -0600 *************** *** 1,3 **** --- 1,9 ---- diff --git a/mats/root-experr-compile-0-f-f-f b/mats/root-experr-compile-0-f-f-f index 3100e14108..1c5428574c 100644 --- a/mats/root-experr-compile-0-f-f-f +++ b/mats/root-experr-compile-0-f-f-f @@ -7555,14 +7555,31 @@ hash.mo:Expected error in mat hashtable-arguments: "hashtable-clear!: # is not mutable". hash.mo:Expected error in mat hashtable-arguments: "hashtable-clear!: invalid size argument #t". hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys)". +hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys $ht 72 43)". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: (hash . table) is not a hashtable". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: -79 is not a valid length". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: not-an-unsigned-integer is not a valid length". +hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys)". hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-keys $ht 72)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-keys: (hash . table) is not a hashtable". hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-values)". -hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-values $ht 72)". +hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-values $ht 72 43)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: (hash . table) is not a hashtable". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: -79 is not a valid length". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-values: not-an-unsigned-integer is not a valid length". +hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries)". +hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries $ht 72 43)". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: (hash . table) is not a hashtable". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: -79 is not a valid length". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: not-an-unsigned-integer is not a valid length". hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries)". hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-entries $ht 72)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-entries: (hash . table) is not a hashtable". +hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-cells)". +hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-cells $ht 72 43)". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: (hash . table) is not a hashtable". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: -79 is not a valid length". +hash.mo:Expected error in mat hashtable-arguments: "hashtable-cells: not-an-unsigned-integer is not a valid length". hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-hash-function)". hash.mo:Expected error in mat hashtable-arguments: "incorrect argument count in call (hashtable-hash-function $ht $ht)". hash.mo:Expected error in mat hashtable-arguments: "hashtable-hash-function: (hash . table) is not an eq hashtable". diff --git a/release_notes/release_notes.stex b/release_notes/release_notes.stex index b24872b4fe..2331f99328 100644 --- a/release_notes/release_notes.stex +++ b/release_notes/release_notes.stex @@ -58,6 +58,14 @@ Online versions of both books can be found at %----------------------------------------------------------------------------- \section{Functionality Changes}\label{section:functionality} +\subsection{Extracting a subset of hashtable entries (9.5.1)} + +The new \scheme{hashtable-cells} function is similar to +\scheme{hashtable-entries}, but it returns a vector of cells instead +of two vectors. An optional argument to \scheme{hashtable-keys}, +\scheme{hashtable-values}, \scheme{hashtable-entries}, or \scheme{hashtable-cells} +limits the size of the result vector. + \subsection{Profile data retained for reclaimed code (9.5.1)} Profile data is now retained indefinitely even for code objects diff --git a/s/newhash.ss b/s/newhash.ss index 0449609c7c..7af992bbf2 100644 --- a/s/newhash.ss +++ b/s/newhash.ss @@ -50,6 +50,7 @@ Documentation notes: (define hashtable-clear!) ; hashtable [k], k >= 0 (define hashtable-keys) ; hashtable (define hashtable-entries) ; hashtable +(define hashtable-cells) ; hashtable (define hashtable-equivalence-function) ; hashtable (define hashtable-hash-function) ; hashtable (define hashtable-mutable?) ; hashtable @@ -91,6 +92,7 @@ Documentation notes: (define $eq-hashtable-keys) ; eq-hashtable (define $eq-hashtable-values) ; eq-hashtable (define $eq-hashtable-entries) ; eq-hashtable +(define $eq-hashtable-cells) ; eq-hashtable (define $eq-hashtable-copy) ; eq-hashtable [mutableflag] (define $eq-hashtable-clear!) ; eq-hashtable [fxminlen] @@ -258,51 +260,70 @@ Documentation notes: (ht-size-set! h 0))) (define $ht-hashtable-keys - (lambda (h) - (let ([keys (make-vector (ht-size h))] - [vec (ht-vec h)]) - (let ([n (vector-length vec)]) - (let f ([i 0] [ikey 0]) - (unless (fx= i n) - (let g ([b (vector-ref vec i)] [ikey ikey]) - (if (null? b) - (f (fx+ i 1) ikey) - (begin - (vector-set! keys ikey (caar b)) - (g (cdr b) (fx+ ikey 1)))))))) - keys))) + (lambda (h max-sz) + (let ([size (fxmin max-sz (ht-size h))]) + (let ([keys (make-vector size)] + [vec (ht-vec h)]) + (let ([n (vector-length vec)]) + (let f ([i 0] [ikey 0]) + (unless (or (fx= i n) (fx= ikey size)) + (let g ([b (vector-ref vec i)] [ikey ikey]) + (if (or (null? b) (fx= ikey size)) + (f (fx+ i 1) ikey) + (begin + (vector-set! keys ikey (caar b)) + (g (cdr b) (fx+ ikey 1)))))))) + keys)))) (define $ht-hashtable-values - (lambda (h) - (let ([vals (make-vector (ht-size h))] - [vec (ht-vec h)]) - (let ([n (vector-length vec)]) - (let f ([i 0] [ival 0]) - (unless (fx= i n) - (let g ([b (vector-ref vec i)] [ival ival]) - (if (null? b) - (f (fx+ i 1) ival) - (begin - (vector-set! vals ival (cdar b)) - (g (cdr b) (fx+ ival 1)))))))) - vals))) + (lambda (h max-sz) + (let ([size (fxmin max-sz (ht-size h))]) + (let ([vals (make-vector size)] + [vec (ht-vec h)]) + (let ([n (vector-length vec)]) + (let f ([i 0] [ival 0]) + (unless (or (fx= i n) (fx= ival size)) + (let g ([b (vector-ref vec i)] [ival ival]) + (if (or (null? b) (fx= ival size)) + (f (fx+ i 1) ival) + (begin + (vector-set! vals ival (cdar b)) + (g (cdr b) (fx+ ival 1)))))))) + vals)))) (define $ht-hashtable-entries - (lambda (h) - (let ([keys (make-vector (ht-size h))] - [vals (make-vector (ht-size h))] - [vec (ht-vec h)]) - (let ([n (vector-length vec)]) - (let f ([i 0] [ikey 0]) - (unless (fx= i n) - (let g ([b (vector-ref vec i)] [ikey ikey]) - (if (null? b) - (f (fx+ i 1) ikey) - (let ([a (car b)]) - (vector-set! keys ikey (car a)) - (vector-set! vals ikey (cdr a)) - (g (cdr b) (fx+ ikey 1)))))))) - (values keys vals)))) + (lambda (h max-sz) + (let ([size (fxmin max-sz (ht-size h))]) + (let ([keys (make-vector size)] + [vals (make-vector size)] + [vec (ht-vec h)]) + (let ([n (vector-length vec)]) + (let f ([i 0] [ikey 0]) + (unless (or (fx= i n) (fx= ikey size)) + (let g ([b (vector-ref vec i)] [ikey ikey]) + (if (or (null? b) (fx= ikey size)) + (f (fx+ i 1) ikey) + (let ([a (car b)]) + (vector-set! keys ikey (car a)) + (vector-set! vals ikey (cdr a)) + (g (cdr b) (fx+ ikey 1)))))))) + (values keys vals))))) + + (define $ht-hashtable-cells + (lambda (h max-sz) + (let ([size (fxmin max-sz (ht-size h))]) + (let ([cells (make-vector size)] + [vec (ht-vec h)]) + (let ([n (vector-length vec)]) + (let f ([i 0] [icell 0]) + (unless (or (fx= i n) (fx= icell size)) + (let g ([b (vector-ref vec i)] [icell icell]) + (if (or (null? b) (fx= icell size)) + (f (fx+ i 1) icell) + (let ([a (car b)]) + (vector-set! cells icell a) + (g (cdr b) (fx+ icell 1)))))))) + cells)))) (define eqv-generic? (lambda (x) @@ -351,7 +372,7 @@ Documentation notes: ($eq-hashtable-copy (eqv-ht-eqht h) mutable?) ($gen-hashtable-copy (eqv-ht-genht h) mutable?)))) - (module ($eqv-hashtable-keys $eqv-hashtable-values $eqv-hashtable-entries) + (module ($eqv-hashtable-keys $eqv-hashtable-values $eqv-hashtable-entries $eqv-hashtable-cells) (define vector-append (lambda (v1 v2) (let ([n1 (vector-length v1)] [n2 (vector-length v2)]) @@ -368,22 +389,27 @@ Documentation notes: (vector-set! v j (vector-ref v2 i))) v)))))) (define $eqv-hashtable-keys - (lambda (h) - (vector-append - ($eq-hashtable-keys (eqv-ht-eqht h)) - ($ht-hashtable-keys (eqv-ht-genht h))))) + (lambda (h max-sz) + (let* ([keys1 ($eq-hashtable-keys (eqv-ht-eqht h) max-sz)] + [keys2 ($ht-hashtable-keys (eqv-ht-genht h) (fx- max-sz (vector-length keys1)))]) + (vector-append keys1 keys2)))) (define $eqv-hashtable-values - (lambda (h) - (vector-append - ($eq-hashtable-values (eqv-ht-eqht h)) - ($ht-hashtable-values (eqv-ht-genht h))))) + (lambda (h max-sz) + (let* ([vals1 ($eq-hashtable-values (eqv-ht-eqht h) max-sz)] + [vals2 ($ht-hashtable-values (eqv-ht-genht h) (fx- max-sz (vector-length vals1)))]) + (vector-append vals1 vals2)))) (define $eqv-hashtable-entries - (lambda (h) - (let-values ([(keys1 vals1) ($eq-hashtable-entries (eqv-ht-eqht h))] - [(keys2 vals2) ($ht-hashtable-entries (eqv-ht-genht h))]) + (lambda (h max-sz) + (let*-values ([(keys1 vals1) ($eq-hashtable-entries (eqv-ht-eqht h) max-sz)] + [(keys2 vals2) ($ht-hashtable-entries (eqv-ht-genht h) (fx- max-sz (vector-length keys1)))]) (values (vector-append keys1 keys2) - (vector-append vals1 vals2)))))) + (vector-append vals1 vals2))))) + (define $eqv-hashtable-cells + (lambda (h max-sz) + (let* ([cells1 ($eq-hashtable-cells (eqv-ht-eqht h) max-sz)] + [cells2 ($ht-hashtable-cells (eqv-ht-genht h) (fx- max-sz (vector-length cells1)))]) + (vector-append cells1 cells2))))) (define number-hash (lambda (z) @@ -477,7 +503,7 @@ Documentation notes: (lambda (h p) (unless (eq-ht? h) ($oops who "~s is not an eq hashtable" h)) (unless (procedure? p) ($oops who "~s is not a procedure" p)) - (let-values ([(keys vals) ($eq-hashtable-entries h)]) + (let-values ([(keys vals) ($eq-hashtable-entries h (most-positive-fixnum))]) (let f ([i (vector-length keys)] [ls '()]) (if (fx= i 0) ls @@ -488,7 +514,7 @@ Documentation notes: (lambda (h p) (unless (eq-ht? h) ($oops who "~s is not an eq hashtable" h)) (unless (procedure? p) ($oops who "~s is not a procedure" p)) - (let-values ([(keys vals) ($eq-hashtable-entries h)]) + (let-values ([(keys vals) ($eq-hashtable-entries h (most-positive-fixnum))]) (vector-for-each p keys vals)))) (set-who! make-eq-hashtable @@ -775,31 +801,73 @@ Documentation notes: ($ht-hashtable-clear! (eqv-ht-genht h) minlen)] [else ($ht-hashtable-clear! h minlen)]))]))) - (set! hashtable-keys - (lambda (h) - (unless (xht? h) - ($oops 'hashtable-keys "~s is not a hashtable" h)) - (case (xht-type h) - [(eq) ($eq-hashtable-keys h)] - [(eqv) ($eqv-hashtable-keys h)] - [else ($ht-hashtable-keys h)]))) + (let () + (define (invalid-length who max-sz) + ($oops who "~s is not a valid length" max-sz)) + (define (invalid-table who h) + ($oops who "~s is not a hashtable" h)) - (set-who! hashtable-values - (lambda (h) - (unless (xht? h) ($oops who "~s is not a hashtable" h)) - (case (xht-type h) - [(eq) ($eq-hashtable-values h)] - [(eqv) ($eqv-hashtable-values h)] - [else ($ht-hashtable-values h)]))) + (define-syntax hashtable-content-dispatch + (syntax-rules () + [(_ who $eq-hashtable-content $eqv-hashtable-content $ht-hashtable-content) + (let () + (define (dispatch h max-sz) + (unless (xht? h) (invalid-table who h)) + (case (xht-type h) + [(eq) ($eq-hashtable-content h max-sz)] + [(eqv) ($eqv-hashtable-content h max-sz)] + [else ($ht-hashtable-content h max-sz)])) + (case-lambda + [(h max-sz) + (cond + [(fixnum? max-sz) + (unless (fx>= max-sz 0) (invalid-length who max-sz)) + (dispatch h max-sz)] + [(bignum? max-sz) + (unless (>= max-sz 0) (invalid-length who max-sz)) + (dispatch h (most-positive-fixnum))] + [else (invalid-length who max-sz)])] + [(h) (dispatch h (most-positive-fixnum))]))])) - (set! hashtable-entries - (lambda (h) - (unless (xht? h) - ($oops 'hashtable-entries "~s is not a hashtable" h)) - (case (xht-type h) - [(eq) ($eq-hashtable-entries h)] - [(eqv) ($eqv-hashtable-entries h)] - [else ($ht-hashtable-entries h)]))) + (set-who! hashtable-keys + (hashtable-content-dispatch who + $eq-hashtable-keys + $eqv-hashtable-keys + $ht-hashtable-keys)) + + (set-who! #(r6rs: hashtable-keys) + (lambda (h) + (unless (xht? h) (invalid-table who h)) + (case (xht-type h) + [(eq) ($eq-hashtable-keys h (most-positive-fixnum))] + [(eqv) ($eqv-hashtable-keys h (most-positive-fixnum))] + [else ($ht-hashtable-keys h (most-positive-fixnum))]))) + + (set-who! hashtable-values + (hashtable-content-dispatch who + $eq-hashtable-values + $eqv-hashtable-values + $ht-hashtable-values)) + + (set-who! hashtable-entries + (hashtable-content-dispatch who + $eq-hashtable-entries + $eqv-hashtable-entries + $ht-hashtable-entries)) + + (set-who! #(r6rs: hashtable-entries) + (lambda (h) + (unless (xht? h) (invalid-table who h)) + (case (xht-type h) + [(eq) ($eq-hashtable-entries h (most-positive-fixnum))] + [(eqv) ($eqv-hashtable-entries h (most-positive-fixnum))] + [else ($ht-hashtable-entries h (most-positive-fixnum))]))) + + (set-who! hashtable-cells + (hashtable-content-dispatch who + $eq-hashtable-cells + $eqv-hashtable-cells + $ht-hashtable-cells))) (set! hashtable-size (lambda (h) @@ -985,50 +1053,64 @@ Documentation notes: (include "hashtable-types.ss") (set! $eq-hashtable-keys - (lambda (h) - (let ([vec (ht-vec h)] [size (ht-size h)]) + (lambda (h max-sz) + (let ([vec (ht-vec h)] [size (fxmin max-sz (ht-size h))]) (let ([n (vector-length vec)] [keys (make-vector size)]) (let outer ([i 0] [j 0]) - (if (fx= i n) + (if (or (fx= i n) (fx= j size)) keys (let inner ([b (vector-ref vec i)] [j j]) - (if (fixnum? b) + (if (or (fixnum? b) (fx= j size)) (outer (fx+ i 1) j) (let ([keyval ($tlc-keyval b)]) (vector-set! keys j (car keyval)) (inner ($tlc-next b) (fx+ j 1))))))))))) (set! $eq-hashtable-values - (lambda (h) - (let ([vec (ht-vec h)] [size (ht-size h)]) + (lambda (h max-sz) + (let ([vec (ht-vec h)] [size (fxmin max-sz (ht-size h))]) (let ([n (vector-length vec)] [vals (make-vector size)]) (let outer ([i 0] [j 0]) - (if (fx= i n) + (if (or (fx= i n) (fx= j size)) vals (let inner ([b (vector-ref vec i)] [j j]) - (if (fixnum? b) + (if (or (fixnum? b) (fx= j size)) (outer (fx+ i 1) j) (let ([keyval ($tlc-keyval b)]) (vector-set! vals j (cdr keyval)) (inner ($tlc-next b) (fx+ j 1))))))))))) (set! $eq-hashtable-entries - (lambda (h) - (let ([vec (ht-vec h)] [size (ht-size h)]) + (lambda (h max-sz) + (let ([vec (ht-vec h)] [size (fxmin max-sz (ht-size h))]) (let ([n (vector-length vec)] [keys (make-vector size)] [vals (make-vector size)]) (let outer ([i 0] [j 0]) - (if (fx= i n) + (if (or (fx= i n) (fx= j size)) (values keys vals) (let inner ([b (vector-ref vec i)] [j j]) - (if (fixnum? b) + (if (or (fixnum? b) (fx= j size)) (outer (fx+ i 1) j) (let ([keyval ($tlc-keyval b)]) (vector-set! keys j (car keyval)) (vector-set! vals j (cdr keyval)) (inner ($tlc-next b) (fx+ j 1))))))))))) + (set! $eq-hashtable-cells + (lambda (h max-sz) + (let ([vec (ht-vec h)] [size (fxmin max-sz (ht-size h))]) + (let ([n (vector-length vec)] [cells (make-vector size)]) + (let outer ([i 0] [j 0]) + (if (or (fx= i n) (fx= j size)) + cells + (let inner ([b (vector-ref vec i)] [j j]) + (if (or (fixnum? b) (fx= j size)) + (outer (fx+ i 1) j) + (let ([keyval ($tlc-keyval b)]) + (vector-set! cells j keyval) + (inner ($tlc-next b) (fx+ j 1))))))))))) + (set! $eq-hashtable-copy (lambda (h1 mutable?) (let ([subtype (eq-ht-subtype h1)]) diff --git a/s/primdata.ss b/s/primdata.ss index f81c0635aa..a01b641c9e 100644 --- a/s/primdata.ss +++ b/s/primdata.ss @@ -529,8 +529,8 @@ (hashtable-update! [sig [(hashtable ptr procedure ptr) -> (void)]] [flags]) (hashtable-copy [sig [(hashtable) (hashtable ptr) -> (hashtable)]] [flags alloc]) (hashtable-clear! [sig [(hashtable) (hashtable sub-uint) -> (void)]] [flags true]) - (hashtable-keys [sig [(hashtable) -> (vector)]] [flags alloc]) - (hashtable-entries [sig [(hashtable) -> (vector vector)]] [flags alloc]) + ((r6rs: hashtable-keys) [sig [(hashtable) -> (vector)]] [flags alloc]) ; no size argument + ((r6rs: hashtable-entries) [sig [(hashtable) -> (vector vector)]] [flags alloc]) ; no size argument (hashtable-equivalence-function [sig [(hashtable) -> (ptr)]] [flags]) (hashtable-hash-function [sig [(hashtable) -> (ptr)]] [flags]) (hashtable-mutable? [sig [(hashtable) -> (boolean)]] [flags mifoldable discard]) @@ -1373,7 +1373,10 @@ (hash-table-for-each [sig [(old-hash-table procedure) -> (void)]] [flags]) (hash-table-map [sig [(old-hash-table procedure) -> (list)]] [flags true]) (hashtable-cell [sig [(old-hash-table ptr ptr) -> ((ptr . ptr))]] [flags true]) - (hashtable-values [sig [(hashtable) -> (vector)]] [flags alloc]) + (hashtable-cells [sig [(hashtable) -> (vector)] [(hashtable uint) -> (vector)]] [flags alloc]) + (hashtable-entries [sig [(hashtable) -> (vector vector)] [(hashtable uint) -> (vector vector)]] [flags alloc]) ; has size argument + (hashtable-keys [sig [(hashtable) -> (vector)] [(hashtable uint) -> (vector)]] [flags alloc]) ; has size argument + (hashtable-values [sig [(hashtable) -> (vector)] [(hashtable uint) -> (vector)]] [flags alloc]) (hashtable-weak? [sig [(hashtable) -> (boolean)]] [flags pure mifoldable discard]) (iconv-codec [feature iconv] [sig [(sub-string) -> (codec)]] [flags pure true]) (ieee-environment [sig [() -> (environment)]] [flags unrestricted alloc]) @@ -1785,6 +1788,7 @@ ($dynamic-closure-counts [flags alloc]) ; added for closure instrumentation ($enum-set-members [flags]) ($eol-style? [flags]) + ($eq-hashtable-cells [flags discard]) ($eq-hashtable-clear! [flags true]) ($eq-hashtable-copy [flags true discard]) ($eq-hashtable-entries [flags discard])