add eqv hash tables; add hash-update

svn: r12018
This commit is contained in:
Matthew Flatt 2008-10-13 16:21:18 +00:00
parent c08e09ae6c
commit ec68bafa9c
28 changed files with 913 additions and 400 deletions

View File

@ -736,7 +736,9 @@
(lambda () (lambda ()
(out (if (hash-table? obj 'equal) (out (if (hash-table? obj 'equal)
"#hash" "#hash"
"#hasheq")) (if (hash-table? obj 'eqv)
"#hasheqv"
"#hasheq")))
(wr-lst (hash-table-map obj (lambda (k v) (wr-lst (hash-table-map obj (lambda (k v)
(cons k (make-hide v)))) (cons k (make-hide v))))
#f depth #f depth
@ -855,7 +857,9 @@
[(hash-table? obj) [(hash-table? obj)
(out (if (hash-table? obj 'equal) (out (if (hash-table? obj 'equal)
"#hash" "#hash"
"#hasheq")) (if (hash-table? obj 'eqv)
"#hasheqv"
"#hasheq")))
(pp-list (hash-table-map obj cons) extra pp-expr #f depth (pp-list (hash-table-map obj cons) extra pp-expr #f depth
pair? car cdr pair-open pair-close)] pair? car cdr pair-open pair-close)]
[(and (box? obj) print-box?) [(and (box? obj) print-box?)

View File

@ -316,42 +316,62 @@ Equivalent to @scheme[(namespace-require `(for-syntax ,req))].}
Raises @scheme[exn:fail], because the operations are not supported.} Raises @scheme[exn:fail], because the operations are not supported.}
@defproc[(hash-table? [v any/c] [flag (one-of/c 'weak 'equal)] ...) @defproc*[([(hash-table? [v any/c])
hash-table?]{ hash-table?]
[(hash-table? [v any/c] [flag (one-of/c 'weak 'equal 'eqv)])
hash-table?]
[(hash-table? [v any/c]
[flag (one-of/c 'weak 'equal 'eqv)]
[flag (one-of/c 'weak 'equal 'eqv)])
hash-table?])]{
Returns @scheme[#t] if @scheme[v] like a hash table created by Returns @scheme[#t] if @scheme[v] like a hash table created by
@scheme[make-hash-table] or @scheme[make-immutable-hash-table] with @scheme[make-hash-table] or @scheme[make-immutable-hash-table] with
the given @scheme[flag]s (or more), @scheme[#f] otherwise. Each the given @scheme[flag]s (or more), @scheme[#f] otherwise. Each
provided @scheme[flag] must be distinct; if the second @scheme[flag] provided @scheme[flag] must be distinct and @scheme['equal] cannot be
is redundant, the @scheme[exn:fail:contract] exception is raised.} used with @scheme['eqv], otherwise the @scheme[exn:fail:contract]
exception is raised.}
@defproc[(make-hash-table [flag (one-of/c 'weak 'equal)] ...) @defproc*[([(make-hash-table)
hash-table?]{ hash-table?]
[(make-hash-table [flag (one-of/c 'weak 'equal 'eqv)])
hash-table?]
[(make-hash-table [flag (one-of/c 'weak 'equal 'eqv)]
[flag (one-of/c 'weak 'equal 'eqv)])
hash-table?])]{
Creates and returns a new hash table. If provided, each @scheme[flag] Creates and returns a new hash table. If provided, each @scheme[flag]
must one of the following: must one of the following:
@itemize{ @itemize{
@item{@indexed-scheme['weak] --- creates a hash table with weakly-held @item{@indexed-scheme['weak] --- creates a hash table with
keys via @scheme[make-weak-hash] or @scheme[make-weak-hasheq]} weakly-held keys via @scheme[make-weak-hash],
@scheme[make-weak-hasheq], or @scheme[make-weak-hasheqv].}
@item{@indexed-scheme['equal] --- creates a hash table that compares @item{@indexed-scheme['equal] --- creates a hash table that compares
keys using @scheme[equal?] instead of @scheme[eq?] using keys using @scheme[equal?] instead of @scheme[eq?] using
@scheme[make-hash] or @scheme[make-weak-hash].} @scheme[make-hash] or @scheme[make-weak-hash].}
@item{@indexed-scheme['eqv] --- creates a hash table that compares
keys using @scheme[eqv?] instead of @scheme[eq?] using
@scheme[make-hasheqv] or @scheme[make-weak-hasheqv].}
} }
By default, key comparisons use @scheme[eq?]. If the second By default, key comparisons use @scheme[eq?] (i.e., the hash table is
@scheme[flag] is redundant, the @scheme[exn:fail:contract] exception created with @scheme[make-hasheq]). If the second @scheme[flag] is
is raised.} redundant or @scheme['equal] is provided with @scheme['eqv], the
@scheme[exn:fail:contract] exception is raised.}
@defproc[(make-immutable-hash-table [assocs (listof pair?)] @defproc*[([(make-immutable-hash-table [assocs (listof pair?)])
[flag (one-of/c 'equal)] (and/c hash-table? immutable?)]
...) [(make-immutable-hash-table [assocs (listof pair?)]
(and/c hash-table? immutable?)]{ [flag (one-of/c 'equal 'eqv)])
(and/c hash-table? immutable?)])]{
Like @scheme[make-immutable-hash] or @scheme[make-immutable-hasheq], Like @scheme[make-immutable-hash], @scheme[make-immutable-hasheq], or
depending on whether an @scheme['equal] @scheme[flag] is provided.} @scheme[make-immutable-hasheqv], depending on whether an
@scheme['equal] or @scheme['eqv] @scheme[flag] is provided.}

View File

@ -12,6 +12,8 @@
dict-ref dict-ref
dict-set! dict-set!
dict-set dict-set
dict-update!
dict-update
dict-remove! dict-remove!
dict-remove dict-remove
dict-count dict-count
@ -206,6 +208,20 @@
[else [else
(raise-type-error 'dict-set "dict" 0 d key val)])) (raise-type-error 'dict-set "dict" 0 d key val)]))
(define dict-update!
(case-lambda
[(d key xform)
(dict-set! d key (xform (dict-ref d key)))]
[(d key xform default)
(dict-set! d key (xform (dict-ref d key default)))]))
(define dict-update
(case-lambda
[(d key xform)
(dict-set d key (xform (dict-ref d key)))]
[(d key xform default)
(dict-set d key (xform (dict-ref d key default)))]))
(define (dict-remove! d key) (define (dict-remove! d key)
(cond (cond
[(hash? d) (hash-remove! d key)] [(hash? d) (hash-remove! d key)]

View File

@ -23,7 +23,8 @@
(#%provide require require-for-syntax require-for-template require-for-label (#%provide require require-for-syntax require-for-template require-for-label
provide provide-for-syntax provide-for-label provide provide-for-syntax provide-for-label
(all-from-except "private/more-scheme.ss" case old-case (all-from-except "private/more-scheme.ss" case old-case
log-fatal log-error log-warning log-info log-debug) log-fatal log-error log-warning log-info log-debug
hash-update hash-update!)
(rename old-case case) (rename old-case case)
(all-from "private/misc.ss") (all-from "private/misc.ss")
(all-from-except "private/stxcase-scheme.ss" _) (all-from-except "private/stxcase-scheme.ss" _)

View File

@ -349,10 +349,39 @@
(define-log log-info info) (define-log log-info info)
(define-log log-debug debug) (define-log log-debug debug)
(define-values (hash-update hash-update!)
(let* ([not-there (gensym)]
[up (lambda (who mut? ref set ht key xform default)
(unless (and (hash? ht)
(or (not mut?)
(not (immutable? ht))))
(raise-type-error who (if mut? "mutable hash" "hash") ht))
(unless (and (procedure? xform)
(procedure-arity-includes? xform 1))
(raise-type-error who "procedure (arity 1)" xform))
(let ([v (ref ht key default)])
(if (eq? v not-there)
(raise-mismatch-error who "no value found for key: " key)
(set ht key (xform v)))))])
(let ([hash-update
(case-lambda
[(ht key xform default)
(up 'hash-update #f hash-ref hash-set ht key xform default)]
[(ht key xform)
(hash-update ht key xform not-there)])]
[hash-update!
(case-lambda
[(ht key xform default)
(up 'hash-update! #t hash-ref hash-set! ht key xform default)]
[(ht key xform)
(hash-update! ht key xform not-there)])])
(values hash-update hash-update!))))
(#%provide case old-case do (#%provide case old-case do
parameterize parameterize* current-parameterization call-with-parameterization parameterize parameterize* current-parameterization call-with-parameterization
parameterize-break current-break-parameterization call-with-break-parameterization parameterize-break current-break-parameterization call-with-break-parameterization
with-handlers with-handlers* call-with-exception-handler with-handlers with-handlers* call-with-exception-handler
set!-values set!-values
let/cc fluid-let time let/cc fluid-let time
log-fatal log-error log-warning log-info log-debug)) log-fatal log-error log-warning log-info log-debug
hash-update hash-update!))

View File

@ -54,12 +54,18 @@
(make-hash) (make-hash)
(if (eq? a 'weak) (if (eq? a 'weak)
(make-weak-hasheq) (make-weak-hasheq)
(raise-mismatch-error 'make-hash-table "bad argument: " a)))] (if (eq? a 'eqv)
[(a b) (if (or (and (eq? a 'equal) (make-hasheqv)
(raise-mismatch-error 'make-hash-table "bad argument: " a))))]
[(a b) (if (or (and (or (eq? a 'equal)
(eq? a 'eqv))
(eq? b 'weak)) (eq? b 'weak))
(and (eq? a 'weak) (and (eq? a 'weak)
(eq? b 'equal))) (or (eq? b 'equal)
(make-weak-hash) (eq? b 'eqv))))
(if (or (eq? a 'eqv) (eq? b 'eqv))
(make-weak-hasheqv)
(make-weak-hash))
(raise-mismatch-error 'make-hash-table "bad arguments: " (list a b)))])) (raise-mismatch-error 'make-hash-table "bad arguments: " (list a b)))]))
(define make-immutable-hash-table (define make-immutable-hash-table
@ -67,23 +73,30 @@
[(l) (make-immutable-hasheq l)] [(l) (make-immutable-hasheq l)]
[(l a) (if (eq? a 'equal) [(l a) (if (eq? a 'equal)
(make-immutable-hash l) (make-immutable-hash l)
(raise-mismatch-error 'make-immutable-hash-table "bad argument: " a))])) (if (eq? a 'eqv)
(make-immutable-hasheqv l)
(raise-mismatch-error 'make-immutable-hash-table "bad argument: " a)))]))
(define hash-table? (define hash-table?
(case-lambda (case-lambda
[(v) (hash? v)] [(v) (hash? v)]
[(v a) (if (eq? a 'equal) [(v a) (if (eq? a 'equal)
(and (hash? v) (and (hash? v)
(not (hash-eq? v))) (not (hash-eq? v))
(not (hash-eqv? v)))
(if (eq? a 'weak) (if (eq? a 'weak)
(and (hash? v) (and (hash? v)
(hash-weak? v)) (hash-weak? v))
(raise-mismatch-error 'hash-table? "bad argument: " a)))] (if (eq? a 'eqv)
[(v a b) (if (or (and (eq? a 'equal) (hash-eqv? v)
(raise-mismatch-error 'hash-table? "bad argument: " a))))]
[(v a b) (if (or (and (or (eq? a 'equal) (eq? a 'eqv))
(eq? b 'weak)) (eq? b 'weak))
(and (eq? a 'weak) (and (eq? a 'weak)
(eq? b 'equal))) (or (eq? b 'equal) (eq? b 'eqv))))
(and (hash? v) (and (hash? v)
(not (hash-eq? v)) (if (or (eq? a 'eqv) (eq? b 'eqv))
(hash-eqv? v)
(not (or (hash-eq? v) (hash-eqv? v))))
(hash-weak? v)) (hash-weak? v))
(raise-mismatch-error 'hash-table? "bad arguments: " (list a b)))]))) (raise-mismatch-error 'hash-table? "bad arguments: " (list a b)))])))

View File

@ -163,6 +163,43 @@ result:
@defproc[(dict-update! [dict (and/c dict? (not/c immutable?))]
[key any/c]
[updater (any/c . -> . any/c)]
[failure-result any/c (lambda () (raise (make-exn:fail ....)))]) void?]{
Composes @scheme[dict-ref] and @scheme[dict-set!] to update an
existing mapping in @scheme[dict].
@examples[
#:eval dict-eval
(define h (make-hash))
(dict-update! h 'a add1)
(dict-update! h 'a add1 0)
h
(define v (vector #f #f #f))
(dict-update! v 0 not)
v
]}
@defproc[(dict-update [dict dict?]
[key any/c]
[updater (any/c . -> . any/c)]
[failure-result any/c (lambda () (raise (make-exn:fail ....)))])
(and/c dict? immutable?)]{
Composes @scheme[dict-ref] and @scheme[dict-set] to functionally
update an existing mapping in @scheme[dict].
@examples[
#:eval dict-eval
(dict-update #hash() 'a add1)
(dict-update #hash() 'a add1 0)
(dict-update #hash((a . "apple") (b . "beer")) 'b string-length)
]}
@defproc[(dict-remove! [dict (and/c dict? (not/c immutable?))] @defproc[(dict-remove! [dict (and/c dict? (not/c immutable?))]
[key any/c]) [key any/c])
void?]{ void?]{

View File

@ -7,10 +7,10 @@
A @deftech{hash table} (or simply @deftech{hash}) maps each of its A @deftech{hash table} (or simply @deftech{hash}) maps each of its
keys to a single value. For a given hash table, keys are equivalent keys to a single value. For a given hash table, keys are equivalent
via @scheme[equal?] or @scheme[eq?], and keys are retained either via @scheme[equal?], @scheme[eqv?], or @scheme[eq?], and keys are
strongly or weakly (see @secref["weakbox"]). A hash table is also retained either strongly or weakly (see @secref["weakbox"]). A hash
either mutable or immutable; immutable tables support constant-time table is also either mutable or immutable; immutable tables support
functional update. constant-time functional update.
A hash table can be used as a two-valued @tech{sequence} (see A hash table can be used as a two-valued @tech{sequence} (see
@secref["sequences"]). The keys and values of the hash table serve as @secref["sequences"]). The keys and values of the hash table serve as
@ -22,13 +22,14 @@ keys and values. See also @scheme[in-hash], @scheme[in-hash-keys],
@scheme[in-hash-values], and @scheme[in-hash-pairs]. @scheme[in-hash-values], and @scheme[in-hash-pairs].
Two hash tables cannot be @scheme[equal?] unless they use the same Two hash tables cannot be @scheme[equal?] unless they use the same
key-comparison procedure (@scheme[equal?] or @scheme[eq?]), both hold keys key-comparison procedure (@scheme[equal?], @scheme[eqv?], or
strongly or weakly, and have the same mutability. @scheme[eq?]), both hold keys strongly or weakly, and have the same
mutability.
@bold{Caveats concerning concurrent modification:} A mutable hash @bold{Caveats concerning concurrent modification:} A mutable hash
table can be manipulated with @scheme[hash-ref], @scheme[hash-set!], table can be manipulated with @scheme[hash-ref], @scheme[hash-set!],
and @scheme[hash-remove!] concurrently by multiple threads, and the and @scheme[hash-remove!] concurrently by multiple threads, and the
operations are protected by a table-specific semaphore as needed. Two operations are protected by a table-specific semaphore as needed. Three
caveats apply, however: caveats apply, however:
@itemize{ @itemize{
@ -50,6 +51,11 @@ caveats apply, however:
otherwise the traversal skips a deleted key or uses the remapped otherwise the traversal skips a deleted key or uses the remapped
key's new value).} key's new value).}
@item{The @scheme[hash-update!] function uses a table's semaphore
independently for the @scheme[hash-ref] and @scheme[hash-set!] parts
of its functionality, which means that the update as a whole is not
``atomic.''}
} }
@bold{Caveat concerning mutable keys:} If a key into an @bold{Caveat concerning mutable keys:} If a key into an
@ -63,10 +69,15 @@ for insertion and lookup operations becomes unpredictable.
Returns @scheme[#t] if @scheme[v] is a @tech{hash table}, @scheme[#f] Returns @scheme[#t] if @scheme[v] is a @tech{hash table}, @scheme[#f]
otherwise.} otherwise.}
@defproc[(hash-eqv? [hash hash?]) boolean?]{
Returns @scheme[#t] if @scheme[hash] compares keys with @scheme[eqv?],
@scheme[#f] if it compares with @scheme[equal?] or @scheme[eq?].}
@defproc[(hash-eq? [hash hash?]) boolean?]{ @defproc[(hash-eq? [hash hash?]) boolean?]{
Returns @scheme[#t] if @scheme[hash] compares keys with @scheme[eq?], Returns @scheme[#t] if @scheme[hash] compares keys with @scheme[eq?],
@scheme[#f] if it compares with @scheme[equal?].} @scheme[#f] if it compares with @scheme[equal?] or @scheme[eqv?].}
@defproc[(hash-weak? [hash hash?]) boolean?]{ @defproc[(hash-weak? [hash hash?]) boolean?]{
@ -82,6 +93,12 @@ uses @scheme[equal?] to compare keys. See also
@scheme[make-custom-hash].} @scheme[make-custom-hash].}
@defproc[(make-hasheqv) (and/c hash? hash-eqv?)]{
Creates an empty mutable hash table that holds keys strongly and that
uses @scheme[eqv?] to compare keys.}
@defproc[(make-hasheq) (and/c hash? hash-eq?)]{ @defproc[(make-hasheq) (and/c hash? hash-eq?)]{
Creates an empty mutable hash table that holds keys strongly and that Creates an empty mutable hash table that holds keys strongly and that
@ -95,6 +112,12 @@ uses @scheme[equal?] to compare keys. See also
@scheme[make-weak-custom-hash].} @scheme[make-weak-custom-hash].}
@defproc[(make-weak-hasheqv) (and/c hash? hash-eqv? hash-weak?)]{
Creates an empty mutable hash table that holds keys weakly and that
uses @scheme[eqv?] to compare keys.}
@defproc[(make-weak-hasheq) (and/c hash? hash-eq? hash-weak?)]{ @defproc[(make-weak-hasheq) (and/c hash? hash-eq? hash-weak?)]{
Creates an empty mutable hash table that holds keys weakly and that Creates an empty mutable hash table that holds keys weakly and that
@ -111,6 +134,12 @@ value. The mappings are added to the table in the order that they
appear in @scheme[assocs], so later mappings can hide earlier appear in @scheme[assocs], so later mappings can hide earlier
mappings.} mappings.}
@defproc[(make-immutable-hasheqv [assocs (listof pair?)])
(and/c hash? hash-eqv? immutable?)]{
Like @scheme[make-immutable-hash], but the resulting hash table
compares keys with @scheme[eqv?].}
@defproc[(make-immutable-hasheq [assocs (listof pair?)]) @defproc[(make-immutable-hasheq [assocs (listof pair?)])
(and/c hash? hash-eq? immutable?)]{ (and/c hash? hash-eq? immutable?)]{
@ -156,6 +185,33 @@ result:
}} }}
@defproc[(hash-update! [hash (and/c hash? (not/c immutable?))]
[key any/c]
[updater (any/c . -> . any/c)]
[failure-result any/c (lambda ()
(raise (make-exn:fail:contract ....)))])
void?]{
Composes @scheme[hash-ref] and @scheme[hash-set!] to update an
existing mapping in @scheme[hash], where the optional
@scheme[failure-result] argument is used as in @scheme[hash-ref] when
no mapping exists for @scheme[key] already. See the caveat above about
concurrent updates.}
@defproc[(hash-update [hash (and/c hash? immutable?)]
[key any/c]
[updater (any/c . -> . any/c)]
[failure-result any/c (lambda ()
(raise (make-exn:fail:contract ....)))])
(and/c hash? immutable?)]{
Composes @scheme[hash-ref] and @scheme[hash-set] to functionally
update an existing mapping in @scheme[hash], where the optional
@scheme[failure-result] argument is used as in @scheme[hash-ref] when
no mapping exists for @scheme[key] already.}
@defproc[(hash-remove! [hash (and/c hash? (not/c immutable?))] @defproc[(hash-remove! [hash (and/c hash? (not/c immutable?))]
[key any/c]) [key any/c])
void?]{ void?]{
@ -259,6 +315,14 @@ returned integer is the same. Furthermore, for the result integer
implies @scheme[(eq? k j)].} implies @scheme[(eq? k j)].}
@defproc[(eqv-hash-code [v any/c]) exact-integer?]{
Returns an exact integer; for any two @scheme[eqv?] values, the
returned integer is the same. Furthermore, for the result integer
@scheme[k] and any other exact integer @scheme[j], @scheme[(= k j)]
implies @scheme[(eq? k j)].}
@defproc[(equal-hash-code [v any/c]) exact-integer?]{ @defproc[(equal-hash-code [v any/c]) exact-integer?]{
Returns an exact integer; for any two @scheme[equal?] values, the Returns an exact integer; for any two @scheme[equal?] values, the

View File

@ -616,7 +616,11 @@ A @as-index{@litchar{#hasheq}} starts a hash table like
@litchar{#hash}, except that it constructs a hash table based on @litchar{#hash}, except that it constructs a hash table based on
@scheme[eq?] instead of @scheme[equal?]. @scheme[eq?] instead of @scheme[equal?].
In either case, the table is constructed by adding each mapping to the A @as-index{@litchar{#hasheqv}} starts a hash table like
@litchar{#hash}, except that it constructs a hash table based on
@scheme[eqv?] instead of @scheme[equal?].
In all cases, the table is constructed by adding each mapping to the
hash table from left to right, so later mappings can hide earlier hash table from left to right, so later mappings can hide earlier
mappings if the keys are equivalent. mappings if the keys are equivalent.

View File

@ -313,6 +313,7 @@
(test #t immutable? (make-immutable-hasheq '((a . b)))) (test #t immutable? (make-immutable-hasheq '((a . b))))
(test #t immutable? (make-immutable-hash '((a . b)))) (test #t immutable? (make-immutable-hash '((a . b))))
(test #f immutable? (make-hasheq)) (test #f immutable? (make-hasheq))
(test #f immutable? (make-hasheqv))
(test #f immutable? (make-hash)) (test #f immutable? (make-hash))
(test #f immutable? (make-weak-hasheq)) (test #f immutable? (make-weak-hasheq))
(test #f immutable? (make-weak-hash)) (test #f immutable? (make-weak-hash))
@ -1904,12 +1905,15 @@
(arity-test make-hash 0 0) (arity-test make-hash 0 0)
(arity-test make-hasheq 0 0) (arity-test make-hasheq 0 0)
(arity-test make-hasheqv 0 0)
(arity-test make-weak-hash 0 0) (arity-test make-weak-hash 0 0)
(arity-test make-weak-hasheq 0 0) (arity-test make-weak-hasheq 0 0)
(arity-test make-weak-hasheqv 0 0)
(define (hash-tests make-hash make-hasheq (define (hash-tests make-hash make-hasheq make-hasheqv
make-weak-hash make-weak-hasheq make-weak-hash make-weak-hasheq make-weak-hasheqv
hash-ref hash-set! hash-remove! hash-count hash-ref hash-set! hash-update!
hash-remove! hash-count
hash-map hash-for-each hash-map hash-for-each
hash-iterate-first hash-iterate-next hash-iterate-first hash-iterate-next
hash-iterate-value hash-iterate-key hash-iterate-value hash-iterate-key
@ -1932,14 +1936,35 @@
(make-hasheq))] (make-hasheq))]
[l (list 1 2 3)]) [l (list 1 2 3)])
(test #t eq? (eq-hash-code l) (eq-hash-code l)) (test #t eq? (eq-hash-code l) (eq-hash-code l))
(test #t eq? (eqv-hash-code l) (eqv-hash-code l))
(test #t eq? (equal-hash-code l) (equal-hash-code l)) (test #t eq? (equal-hash-code l) (equal-hash-code l))
(test #t eq? (equal-hash-code l) (equal-hash-code (list 1 2 3))) (test #t eq? (equal-hash-code l) (equal-hash-code (list 1 2 3)))
(hash-set! h1 l 'ok) (hash-set! h1 l 'ok)
(test 'ok hash-ref h1 l) (test 'ok hash-ref h1 l)
(hash-update! h1 l (curry cons 'more))
(test '(more . ok) hash-ref h1 l)
(hash-update! h1 l cdr)
(test 'nope hash-ref h1 (list 1 2 3) (lambda () 'nope)) (test 'nope hash-ref h1 (list 1 2 3) (lambda () 'nope))
(test '(((1 2 3) . ok)) hash-map h1 (lambda (k v) (cons k v))) (test '(((1 2 3) . ok)) hash-map h1 (lambda (k v) (cons k v)))
(hash-remove! h1 l) (hash-remove! h1 l)
(test 'nope hash-ref h1 l (lambda () 'nope))) (test 'nope hash-ref h1 l (lambda () 'nope))
(err/rt-test (hash-update! h1 l add1))
(hash-update! h1 l add1 0)
(test 1 hash-ref h1 l)
(hash-remove! h1 l))
(let ([h1 (if weak?
(make-weak-hasheqv)
(make-hasheqv))]
[n (expt 2 500)]
[q (/ 1 2)]
[s (make-string 2 #\q)])
(hash-set! h1 n 'power)
(hash-set! h1 q 'half)
(hash-set! h1 s 'string)
(test 'power hash-ref h1 (expt (read (open-input-string "2")) 500))
(test 'half hash-ref h1 (/ 1 (read (open-input-string "2"))))
(test #f hash-ref h1 (make-string (read (open-input-string "2")) #\q) #f))
(let ([h1 (if weak? (let ([h1 (if weak?
(make-weak-hash) (make-weak-hash)
@ -2066,9 +2091,10 @@
(save)))) ; prevents gcing of the ht-registered values (save)))) ; prevents gcing of the ht-registered values
(hash-tests make-hash make-hasheq (hash-tests make-hash make-hasheq make-hasheqv
make-weak-hash make-weak-hasheq make-weak-hash make-weak-hasheq make-weak-hasheqv
hash-ref hash-set! hash-remove! hash-count hash-ref hash-set! hash-update!
hash-remove! hash-count
hash-map hash-for-each hash-map hash-for-each
hash-iterate-first hash-iterate-next hash-iterate-first hash-iterate-next
hash-iterate-value hash-iterate-key hash-iterate-value hash-iterate-key
@ -2078,9 +2104,13 @@
(apply proc (unbox ht) args)))]) (apply proc (unbox ht) args)))])
(hash-tests (lambda () (box #hash())) (hash-tests (lambda () (box #hash()))
(lambda () (box #hasheq())) (lambda () (box #hasheq()))
#f #f (lambda () (box #hasheqv()))
#f #f #f
(ub-wrap hash-ref) (ub-wrap hash-ref)
(lambda (ht k v) (set-box! ht (hash-set (unbox ht) k v))) (lambda (ht k v) (set-box! ht (hash-set (unbox ht) k v)))
(case-lambda
[(ht k u) (set-box! ht (hash-update (unbox ht) k u))]
[(ht k u def) (set-box! ht (hash-update (unbox ht) k u def))])
(lambda (ht k) (set-box! ht (hash-remove (unbox ht) k))) (lambda (ht k) (set-box! ht (hash-remove (unbox ht) k)))
(ub-wrap hash-count) (ub-wrap hash-count)
(ub-wrap hash-map) (ub-wrap hash-map)
@ -2093,18 +2123,35 @@
(test #f hash? 5) (test #f hash? 5)
(test #t hash? (make-hasheq)) (test #t hash? (make-hasheq))
(test #t hash? (make-hasheqv))
(test #t hash-eq? (make-hasheq)) (test #t hash-eq? (make-hasheq))
(test #f hash-eq? (make-hash)) (test #f hash-eq? (make-hash))
(test #f hash-eq? (make-hasheqv))
(test #t hash-eq? (make-weak-hasheq)) (test #t hash-eq? (make-weak-hasheq))
(test #f hash-eq? (make-weak-hash)) (test #f hash-eq? (make-weak-hash))
(test #f hash-eq? (make-weak-hasheqv))
(test #f hash-eqv? (make-hasheq))
(test #f hash-eqv? (make-hash))
(test #t hash-eqv? (make-hasheqv))
(test #f hash-eqv? (make-weak-hasheq))
(test #f hash-eqv? (make-weak-hash))
(test #t hash-eqv? (make-weak-hasheqv))
(test #f hash-weak? (make-hasheq)) (test #f hash-weak? (make-hasheq))
(test #f hash-weak? (make-hash)) (test #f hash-weak? (make-hash))
(test #f hash-weak? (make-hasheqv))
(test #t hash-weak? (make-weak-hasheq)) (test #t hash-weak? (make-weak-hasheq))
(test #t hash-weak? (make-weak-hash)) (test #t hash-weak? (make-weak-hash))
(test #t hash-weak? (make-weak-hasheqv))
(err/rt-test (hash-eq? 5)) (err/rt-test (hash-eq? 5))
(err/rt-test (hash-eqv? 5))
(err/rt-test (hash-weak? 5)) (err/rt-test (hash-weak? 5))
(let ([a (expt 2 500)]
[b (expt (read (open-input-string "2")) 500)])
(test #t equal? (eqv-hash-code a) (eqv-hash-code b))
(test #t equal? (equal-hash-code a) (equal-hash-code b)))
;; Check for proper clearing of weak hash tables ;; Check for proper clearing of weak hash tables
;; (internally, value should get cleared along with key): ;; (internally, value should get cleared along with key):
(let ([ht (make-weak-hasheq)]) (let ([ht (make-weak-hasheq)])
@ -2139,6 +2186,28 @@
(err/rt-test (hash-remove! 1 2)) (err/rt-test (hash-remove! 1 2))
(err/rt-test (hash-ref (make-hasheq) 2) exn:application:mismatch?) (err/rt-test (hash-ref (make-hasheq) 2) exn:application:mismatch?)
(let ([mk (lambda (mk)
(let ([ht (mk)])
(hash-set! ht make-hash 2)
ht))])
(test #t equal? (mk make-hash) (mk make-hash))
(test #t equal? (mk make-hasheq) (mk make-hasheq))
(test #t equal? (mk make-hasheqv) (mk make-hasheqv))
(test #f equal? (mk make-hash) (mk make-hasheq))
(test #f equal? (mk make-hash) (mk make-hasheqv))
(test #f equal? (mk make-hasheq) (mk make-hasheqv))
(test #f equal? (mk make-hash) (mk make-weak-hash))
(test #f equal? (mk make-hasheq) (mk make-weak-hasheq))
(test #f equal? (mk make-hasheqv) (mk make-weak-hasheqv)))
(let ([mk (lambda (mk)
(mk `((1 . 2))))])
(test #t equal? (mk make-immutable-hash) (mk make-immutable-hash))
(test #t equal? (mk make-immutable-hasheq) (mk make-immutable-hasheq))
(test #t equal? (mk make-immutable-hasheqv) (mk make-immutable-hasheqv))
(test #f equal? (mk make-immutable-hash) (mk make-immutable-hasheq))
(test #f equal? (mk make-immutable-hash) (mk make-immutable-hasheqv))
(test #f equal? (mk make-immutable-hasheq) (mk make-immutable-hasheqv)))
(define im-t (make-immutable-hasheq null)) (define im-t (make-immutable-hasheq null))
(test #t hash? im-t) (test #t hash? im-t)
(test #t hash-eq? im-t) (test #t hash-eq? im-t)

View File

@ -295,6 +295,7 @@
(err/rt-test (readstr "#hash") exn:fail:read:eof?) (err/rt-test (readstr "#hash") exn:fail:read:eof?)
(err/rt-test (readstr "#hashe") exn:fail:read:eof?) (err/rt-test (readstr "#hashe") exn:fail:read:eof?)
(err/rt-test (readstr "#hasheq") exn:fail:read:eof?) (err/rt-test (readstr "#hasheq") exn:fail:read:eof?)
(err/rt-test (readstr "#hasheqv") exn:fail:read:eof?)
(err/rt-test (readstr "#hash(") exn:fail:read:eof?) (err/rt-test (readstr "#hash(") exn:fail:read:eof?)
(err/rt-test (readstr "#hash((1") exn:fail:read:eof?) (err/rt-test (readstr "#hash((1") exn:fail:read:eof?)
(err/rt-test (readstr "#hash((1 .") exn:fail:read:eof?) (err/rt-test (readstr "#hash((1 .") exn:fail:read:eof?)
@ -331,12 +332,16 @@
(test-ht (readstr "#hash{(1 . 2)}") 1 #f 1 2) (test-ht (readstr "#hash{(1 . 2)}") 1 #f 1 2)
(test-ht (readstr "#hash{[1 . 2]}") 1 #f 1 2) (test-ht (readstr "#hash{[1 . 2]}") 1 #f 1 2)
(test-ht (readstr "#hasheq((1 . 2))") 1 #t 1 2) (test-ht (readstr "#hasheq((1 . 2))") 1 #t 1 2)
(test-ht (readstr "#hasheqv((1 . 2))") 1 #f 1 2)
(test-ht (readstr "#hash((\"apple\" . 1))") 1 #f "apple" 1) (test-ht (readstr "#hash((\"apple\" . 1))") 1 #f "apple" 1)
(test-ht (readstr "#hasheq((\"apple\" . 1))") 1 #t "apple" #f) (test-ht (readstr "#hasheq((\"apple\" . 1))") 1 #t "apple" #f)
(test-ht (readstr "#hasheqv((\"apple\" . 1))") 1 #f "apple" #f)
(test-ht (readstr "#hash((\"apple\" . 1) (\"apple\" . 10))") 1 #f "apple" 10) (test-ht (readstr "#hash((\"apple\" . 1) (\"apple\" . 10))") 1 #f "apple" 10)
(test-ht (readstr "#hasheq((\"apple\" . 1) (\"apple\" . 10))") 2 #t "apple" #f) (test-ht (readstr "#hasheq((\"apple\" . 1) (\"apple\" . 10))") 2 #t "apple" #f)
(test-ht (readstr "#hasheqv((\"apple\" . 1) (\"apple\" . 10))") 2 #f "apple" #f)
(test-ht (readstr "#hash((apple . 1) (apple . 10))") 1 #f 'apple 10) (test-ht (readstr "#hash((apple . 1) (apple . 10))") 1 #f 'apple 10)
(test-ht (readstr "#hasheq((apple . 1) (apple . 10))") 1 #t 'apple 10) (test-ht (readstr "#hasheq((apple . 1) (apple . 10))") 1 #t 'apple 10)
(test-ht (readstr "#hasheqv((apple . 1) (apple . 10))") 1 #f 'apple 10)
(test-ht (readstr "#hasheq((#0=\"apple\" . 1) (#0# . 10))") 1 #t "apple" #f) (test-ht (readstr "#hasheq((#0=\"apple\" . 1) (#0# . 10))") 1 #t "apple" #f)
(test-ht (readstr "#hash((#0=\"apple\" . 1) (\"banana\" . #0#))") 2 #f "banana" "apple") (test-ht (readstr "#hash((#0=\"apple\" . 1) (\"banana\" . #0#))") 2 #f "banana" "apple")
(test-ht (readstr "#hash((a . 1) (b . 2) (c . 3) (e . 4) (f . 5) (g . 6) (h . 7) (i . 8))") 8 #f 'f 5) (test-ht (readstr "#hash((a . 1) (b . 2) (c . 3) (e . 4) (f . 5) (g . 6) (h . 7) (i . 8))") 8 #f 'f 5)

View File

@ -1,3 +1,7 @@
Version 4.1.1.2
Added eqv-based hash tables
Added hash-update and hash-update!
Version 4.1.1.1 Version 4.1.1.1
Changed -X and -S to complete directory relative to pwd, and Changed -X and -S to complete directory relative to pwd, and
changed -S to add after main collects changed -S to add after main collects

View File

@ -205,6 +205,7 @@ scheme_bucket_table_equal
scheme_clone_bucket_table scheme_clone_bucket_table
scheme_make_hash_table scheme_make_hash_table
scheme_make_hash_table_equal scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set scheme_hash_set
scheme_hash_get scheme_hash_get
scheme_eq_hash_get scheme_eq_hash_get
@ -212,6 +213,7 @@ scheme_hash_set_atomic
scheme_hash_get_atomic scheme_hash_get_atomic
scheme_hash_table_equal scheme_hash_table_equal
scheme_is_hash_table_equal scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table scheme_clone_hash_table
scheme_make_hash_tree scheme_make_hash_tree
scheme_hash_tree_set scheme_hash_tree_set
@ -220,6 +222,7 @@ scheme_hash_tree_next
scheme_hash_tree_index scheme_hash_tree_index
scheme_hash_tree_equal scheme_hash_tree_equal
scheme_is_hash_tree_equal scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim scheme_make_prim
scheme_make_noneternal_prim scheme_make_noneternal_prim
scheme_make_prim_w_arity scheme_make_prim_w_arity
@ -519,6 +522,8 @@ scheme_equal_hash_key
scheme_equal_hash_key2 scheme_equal_hash_key2
scheme_recur_equal_hash_key scheme_recur_equal_hash_key
scheme_recur_equal_hash_key2 scheme_recur_equal_hash_key2
scheme_eqv_hash_key
scheme_eqv_hash_key2
scheme_set_type_equality scheme_set_type_equality
scheme_recur_equal scheme_recur_equal
scheme_build_list scheme_build_list

View File

@ -216,6 +216,7 @@ scheme_bucket_table_equal
scheme_clone_bucket_table scheme_clone_bucket_table
scheme_make_hash_table scheme_make_hash_table
scheme_make_hash_table_equal scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set scheme_hash_set
scheme_hash_get scheme_hash_get
scheme_eq_hash_get scheme_eq_hash_get
@ -223,6 +224,7 @@ scheme_hash_set_atomic
scheme_hash_get_atomic scheme_hash_get_atomic
scheme_hash_table_equal scheme_hash_table_equal
scheme_is_hash_table_equal scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table scheme_clone_hash_table
scheme_make_hash_tree scheme_make_hash_tree
scheme_hash_tree_set scheme_hash_tree_set
@ -231,6 +233,7 @@ scheme_hash_tree_next
scheme_hash_tree_index scheme_hash_tree_index
scheme_hash_tree_equal scheme_hash_tree_equal
scheme_is_hash_tree_equal scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim scheme_make_prim
scheme_make_noneternal_prim scheme_make_noneternal_prim
scheme_make_prim_w_arity scheme_make_prim_w_arity
@ -531,6 +534,8 @@ scheme_equal_hash_key
scheme_equal_hash_key2 scheme_equal_hash_key2
scheme_recur_equal_hash_key scheme_recur_equal_hash_key
scheme_recur_equal_hash_key2 scheme_recur_equal_hash_key2
scheme_eqv_hash_key
scheme_eqv_hash_key2
scheme_set_type_equality scheme_set_type_equality
scheme_recur_equal scheme_recur_equal
scheme_build_list scheme_build_list

View File

@ -193,6 +193,7 @@ EXPORTS
scheme_clone_bucket_table scheme_clone_bucket_table
scheme_make_hash_table scheme_make_hash_table
scheme_make_hash_table_equal scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set scheme_hash_set
scheme_hash_get scheme_hash_get
scheme_eq_hash_get scheme_eq_hash_get
@ -200,6 +201,7 @@ EXPORTS
scheme_hash_get_atomic scheme_hash_get_atomic
scheme_hash_table_equal scheme_hash_table_equal
scheme_is_hash_table_equal scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table scheme_clone_hash_table
scheme_make_hash_tree scheme_make_hash_tree
scheme_hash_tree_set scheme_hash_tree_set
@ -208,6 +210,7 @@ EXPORTS
scheme_hash_tree_index scheme_hash_tree_index
scheme_hash_tree_equal scheme_hash_tree_equal
scheme_is_hash_tree_equal scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim scheme_make_prim
scheme_make_noneternal_prim scheme_make_noneternal_prim
scheme_make_prim_w_arity scheme_make_prim_w_arity
@ -507,6 +510,8 @@ EXPORTS
scheme_equal_hash_key2 scheme_equal_hash_key2
scheme_recur_equal_hash_key scheme_recur_equal_hash_key
scheme_recur_equal_hash_key2 scheme_recur_equal_hash_key2
scheme_eqv_hash_key
scheme_eqv_hash_key2
scheme_set_type_equality scheme_set_type_equality
scheme_recur_equal scheme_recur_equal
scheme_build_list scheme_build_list

View File

@ -208,6 +208,7 @@ EXPORTS
scheme_clone_bucket_table scheme_clone_bucket_table
scheme_make_hash_table scheme_make_hash_table
scheme_make_hash_table_equal scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set scheme_hash_set
scheme_hash_get scheme_hash_get
scheme_eq_hash_get scheme_eq_hash_get
@ -215,6 +216,7 @@ EXPORTS
scheme_hash_get_atomic scheme_hash_get_atomic
scheme_hash_table_equal scheme_hash_table_equal
scheme_is_hash_table_equal scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table scheme_clone_hash_table
scheme_make_hash_tree scheme_make_hash_tree
scheme_hash_tree_set scheme_hash_tree_set
@ -223,6 +225,7 @@ EXPORTS
scheme_hash_tree_index scheme_hash_tree_index
scheme_hash_tree_equal scheme_hash_tree_equal
scheme_is_hash_tree_equal scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim scheme_make_prim
scheme_make_noneternal_prim scheme_make_noneternal_prim
scheme_make_prim_w_arity scheme_make_prim_w_arity
@ -523,6 +526,8 @@ EXPORTS
scheme_equal_hash_key2 scheme_equal_hash_key2
scheme_recur_equal_hash_key scheme_recur_equal_hash_key
scheme_recur_equal_hash_key2 scheme_recur_equal_hash_key2
scheme_eqv_hash_key
scheme_eqv_hash_key2
scheme_set_type_equality scheme_set_type_equality
scheme_recur_equal scheme_recur_equal
scheme_build_list scheme_build_list

View File

@ -1,75 +1,75 @@
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,50,0,0,0,1,0,0,6,0,9,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,50,0,0,0,1,0,0,6,0,9,0,
13,0,20,0,23,0,36,0,41,0,48,0,53,0,58,0,65,0,69,0,78, 13,0,26,0,29,0,34,0,41,0,46,0,51,0,58,0,65,0,69,0,78,
0,84,0,98,0,112,0,115,0,119,0,121,0,132,0,134,0,148,0,155,0, 0,84,0,98,0,112,0,115,0,119,0,121,0,132,0,134,0,148,0,155,0,
177,0,179,0,193,0,253,0,23,1,32,1,41,1,51,1,68,1,107,1,146, 177,0,179,0,193,0,253,0,23,1,32,1,41,1,51,1,68,1,107,1,146,
1,215,1,4,2,92,2,137,2,142,2,162,2,53,3,73,3,124,3,190,3, 1,215,1,4,2,92,2,137,2,142,2,162,2,53,3,73,3,124,3,190,3,
75,4,233,4,20,5,31,5,110,5,0,0,119,7,0,0,65,98,101,103,105, 75,4,233,4,20,5,31,5,110,5,0,0,119,7,0,0,65,98,101,103,105,
110,29,11,11,63,108,101,116,66,100,101,102,105,110,101,62,111,114,72,112,97, 110,29,11,11,63,108,101,116,72,112,97,114,97,109,101,116,101,114,105,122,101,
114,97,109,101,116,101,114,105,122,101,64,108,101,116,42,66,117,110,108,101,115, 62,111,114,64,108,101,116,42,66,117,110,108,101,115,115,64,99,111,110,100,64,
115,64,99,111,110,100,64,119,104,101,110,66,108,101,116,114,101,99,63,97,110, 119,104,101,110,66,108,101,116,114,101,99,66,100,101,102,105,110,101,63,97,110,
100,68,104,101,114,101,45,115,116,120,65,113,117,111,116,101,29,94,2,14,68, 100,68,104,101,114,101,45,115,116,120,65,113,117,111,116,101,29,94,2,14,68,
35,37,107,101,114,110,101,108,11,29,94,2,14,68,35,37,112,97,114,97,109, 35,37,107,101,114,110,101,108,11,29,94,2,14,68,35,37,112,97,114,97,109,
122,11,62,105,102,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117,101, 122,11,62,105,102,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117,101,
115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109, 115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109,
98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, 98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,
45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,98, 45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,98,
10,35,11,8,174,227,94,159,2,16,35,35,159,2,15,35,35,16,20,2,3, 10,35,11,8,186,227,94,159,2,16,35,35,159,2,15,35,35,16,20,2,3,
2,2,2,4,2,2,2,11,2,2,2,5,2,2,2,6,2,2,2,7,2, 2,2,2,4,2,2,2,10,2,2,2,5,2,2,2,6,2,2,2,7,2,
2,2,8,2,2,2,9,2,2,2,10,2,2,2,12,2,2,97,36,11,8, 2,2,8,2,2,2,9,2,2,2,11,2,2,2,12,2,2,97,36,11,8,
174,227,93,159,2,15,35,36,16,2,2,13,161,2,2,36,2,13,2,2,2, 186,227,93,159,2,15,35,36,16,2,2,13,161,2,2,36,2,13,2,2,2,
13,97,10,11,11,8,174,227,16,0,97,10,37,11,8,174,227,16,0,13,16, 13,97,10,11,11,8,186,227,16,0,97,10,37,11,8,186,227,16,0,13,16,
4,35,29,11,11,2,2,11,18,98,64,104,101,114,101,8,31,8,30,8,29, 4,35,29,11,11,2,2,11,18,98,64,104,101,114,101,8,31,8,30,8,29,
8,28,8,27,27,248,22,190,3,23,196,1,249,22,183,3,80,158,38,35,251, 8,28,8,27,27,248,22,132,4,23,196,1,249,22,189,3,80,158,38,35,251,
22,73,2,17,248,22,88,23,200,2,12,249,22,63,2,1,248,22,90,23,202, 22,73,2,17,248,22,88,23,200,2,12,249,22,63,2,1,248,22,90,23,202,
1,27,248,22,190,3,23,196,1,249,22,183,3,80,158,38,35,251,22,73,2, 1,27,248,22,132,4,23,196,1,249,22,189,3,80,158,38,35,251,22,73,2,
17,248,22,88,23,200,2,249,22,63,2,1,248,22,90,23,202,1,12,27,248, 17,248,22,88,23,200,2,249,22,63,2,1,248,22,90,23,202,1,12,27,248,
22,65,248,22,190,3,23,197,1,28,248,22,71,23,194,2,20,15,159,36,35, 22,65,248,22,132,4,23,197,1,28,248,22,71,23,194,2,20,15,159,36,35,
36,28,248,22,71,248,22,65,23,195,2,248,22,64,193,249,22,183,3,80,158, 36,28,248,22,71,248,22,65,23,195,2,248,22,64,193,249,22,189,3,80,158,
38,35,251,22,73,2,17,248,22,64,23,200,2,249,22,63,2,12,248,22,65, 38,35,251,22,73,2,17,248,22,64,23,200,2,249,22,63,2,12,248,22,65,
23,202,1,11,18,100,10,8,31,8,30,8,29,8,28,8,27,16,4,11,11, 23,202,1,11,18,100,10,8,31,8,30,8,29,8,28,8,27,16,4,11,11,
2,18,3,1,7,101,110,118,57,57,52,52,16,4,11,11,2,19,3,1,7, 2,18,3,1,7,101,110,118,57,57,53,54,16,4,11,11,2,19,3,1,7,
101,110,118,57,57,52,53,27,248,22,65,248,22,190,3,23,197,1,28,248,22, 101,110,118,57,57,53,55,27,248,22,65,248,22,132,4,23,197,1,28,248,22,
71,23,194,2,20,15,159,36,35,36,28,248,22,71,248,22,65,23,195,2,248, 71,23,194,2,20,15,159,36,35,36,28,248,22,71,248,22,65,23,195,2,248,
22,64,193,249,22,183,3,80,158,38,35,250,22,73,2,20,248,22,73,249,22, 22,64,193,249,22,189,3,80,158,38,35,250,22,73,2,20,248,22,73,249,22,
73,248,22,73,2,21,248,22,64,23,202,2,251,22,73,2,17,2,21,2,21, 73,248,22,73,2,21,248,22,64,23,202,2,251,22,73,2,17,2,21,2,21,
249,22,63,2,5,248,22,65,23,205,1,18,100,11,8,31,8,30,8,29,8, 249,22,63,2,5,248,22,65,23,205,1,18,100,11,8,31,8,30,8,29,8,
28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,52,55,16,4, 28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,53,57,16,4,
11,11,2,19,3,1,7,101,110,118,57,57,52,56,248,22,190,3,193,27,248, 11,11,2,19,3,1,7,101,110,118,57,57,54,48,248,22,132,4,193,27,248,
22,190,3,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22, 22,132,4,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22,
65,248,22,190,3,23,197,1,249,22,183,3,80,158,38,35,28,248,22,51,248, 65,248,22,132,4,23,197,1,249,22,189,3,80,158,38,35,28,248,22,51,248,
22,184,3,248,22,64,23,198,2,27,249,22,2,32,0,89,162,8,44,36,42, 22,190,3,248,22,64,23,198,2,27,249,22,2,32,0,89,162,8,44,36,42,
9,222,33,39,248,22,190,3,248,22,88,23,200,2,250,22,73,2,22,248,22, 9,222,33,39,248,22,132,4,248,22,88,23,200,2,250,22,73,2,22,248,22,
73,249,22,73,248,22,73,248,22,64,23,204,2,250,22,74,2,23,249,22,2, 73,249,22,73,248,22,73,248,22,64,23,204,2,250,22,74,2,23,249,22,2,
22,64,23,204,2,248,22,90,23,206,2,249,22,63,248,22,64,23,202,1,249, 22,64,23,204,2,248,22,90,23,206,2,249,22,63,248,22,64,23,202,1,249,
22,2,22,88,23,200,1,250,22,74,2,20,249,22,2,32,0,89,162,8,44, 22,2,22,88,23,200,1,250,22,74,2,20,249,22,2,32,0,89,162,8,44,
36,46,9,222,33,40,248,22,190,3,248,22,64,201,248,22,65,198,27,248,22, 36,46,9,222,33,40,248,22,132,4,248,22,64,201,248,22,65,198,27,248,22,
190,3,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22,65, 132,4,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22,65,
248,22,190,3,23,197,1,249,22,183,3,80,158,38,35,250,22,74,2,22,249, 248,22,132,4,23,197,1,249,22,189,3,80,158,38,35,250,22,74,2,22,249,
22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,190,3,248,22,64, 22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,132,4,248,22,64,
201,248,22,65,198,27,248,22,65,248,22,190,3,196,27,248,22,190,3,248,22, 201,248,22,65,198,27,248,22,65,248,22,132,4,196,27,248,22,132,4,248,22,
64,195,249,22,183,3,80,158,39,35,28,248,22,71,195,250,22,74,2,20,9, 64,195,249,22,189,3,80,158,39,35,28,248,22,71,195,250,22,74,2,20,9,
248,22,65,199,250,22,73,2,3,248,22,73,248,22,64,199,250,22,74,2,7, 248,22,65,199,250,22,73,2,3,248,22,73,248,22,64,199,250,22,74,2,6,
248,22,65,201,248,22,65,202,27,248,22,65,248,22,190,3,23,197,1,27,249, 248,22,65,201,248,22,65,202,27,248,22,65,248,22,132,4,23,197,1,27,249,
22,1,22,77,249,22,2,22,190,3,248,22,190,3,248,22,64,199,249,22,183, 22,1,22,77,249,22,2,22,132,4,248,22,132,4,248,22,64,199,249,22,189,
3,80,158,39,35,251,22,73,1,22,119,105,116,104,45,99,111,110,116,105,110, 3,80,158,39,35,251,22,73,1,22,119,105,116,104,45,99,111,110,116,105,110,
117,97,116,105,111,110,45,109,97,114,107,2,24,250,22,74,1,23,101,120,116, 117,97,116,105,111,110,45,109,97,114,107,2,24,250,22,74,1,23,101,120,116,
101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,21, 101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,21,
95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,45, 95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,45,
115,101,116,45,102,105,114,115,116,11,2,24,201,250,22,74,2,20,9,248,22, 115,101,116,45,102,105,114,115,116,11,2,24,201,250,22,74,2,20,9,248,22,
65,203,27,248,22,65,248,22,190,3,23,197,1,28,248,22,71,23,194,2,20, 65,203,27,248,22,65,248,22,132,4,23,197,1,28,248,22,71,23,194,2,20,
15,159,36,35,36,249,22,183,3,80,158,38,35,27,248,22,190,3,248,22,64, 15,159,36,35,36,249,22,189,3,80,158,38,35,27,248,22,132,4,248,22,64,
23,198,2,28,249,22,154,8,62,61,62,248,22,184,3,248,22,88,23,197,2, 23,198,2,28,249,22,160,8,62,61,62,248,22,190,3,248,22,88,23,197,2,
250,22,73,2,20,248,22,73,249,22,73,21,93,2,25,248,22,64,199,250,22, 250,22,73,2,20,248,22,73,249,22,73,21,93,2,25,248,22,64,199,250,22,
74,2,9,249,22,73,2,25,249,22,73,248,22,97,203,2,25,248,22,65,202, 74,2,8,249,22,73,2,25,249,22,73,248,22,97,203,2,25,248,22,65,202,
251,22,73,2,17,28,249,22,154,8,248,22,184,3,248,22,64,23,201,2,64, 251,22,73,2,17,28,249,22,160,8,248,22,190,3,248,22,64,23,201,2,64,
101,108,115,101,10,248,22,64,23,198,2,250,22,74,2,20,9,248,22,65,23, 101,108,115,101,10,248,22,64,23,198,2,250,22,74,2,20,9,248,22,65,23,
201,1,249,22,63,2,9,248,22,65,23,203,1,99,8,31,8,30,8,29,8, 201,1,249,22,63,2,8,248,22,65,23,203,1,99,8,31,8,30,8,29,8,
28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,55,48,16,4, 28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,57,57,56,50,16,4,
11,11,2,19,3,1,7,101,110,118,57,57,55,49,18,158,94,10,64,118,111, 11,11,2,19,3,1,7,101,110,118,57,57,56,51,18,158,94,10,64,118,111,
105,100,8,47,27,248,22,65,248,22,190,3,196,249,22,183,3,80,158,38,35, 105,100,8,47,27,248,22,65,248,22,132,4,196,249,22,189,3,80,158,38,35,
28,248,22,51,248,22,184,3,248,22,64,197,250,22,73,2,26,248,22,73,248, 28,248,22,51,248,22,190,3,248,22,64,197,250,22,73,2,26,248,22,73,248,
22,64,199,248,22,88,198,27,248,22,184,3,248,22,64,197,250,22,73,2,26, 22,64,199,248,22,88,198,27,248,22,190,3,248,22,64,197,250,22,73,2,26,
248,22,73,248,22,64,197,250,22,74,2,23,248,22,65,199,248,22,65,202,159, 248,22,73,248,22,64,197,250,22,74,2,23,248,22,65,199,248,22,65,202,159,
35,20,103,159,35,16,1,2,1,16,0,83,158,41,20,100,138,69,35,37,109, 35,20,103,159,35,16,1,2,1,16,0,83,158,41,20,100,138,69,35,37,109,
105,110,45,115,116,120,2,2,11,10,11,10,35,80,158,35,35,20,103,159,35, 105,110,45,115,116,120,2,2,11,10,11,10,35,80,158,35,35,20,103,159,35,
@ -78,28 +78,28 @@
11,11,11,11,11,11,16,10,2,3,2,4,2,5,2,6,2,7,2,8,2, 11,11,11,11,11,11,16,10,2,3,2,4,2,5,2,6,2,7,2,8,2,
9,2,10,2,11,2,12,35,45,36,11,11,16,0,16,0,16,0,35,35,11, 9,2,10,2,11,2,12,35,45,36,11,11,16,0,16,0,16,0,35,35,11,
11,11,16,0,16,0,16,0,35,35,16,11,16,5,93,2,13,20,15,159,35, 11,11,16,0,16,0,16,0,35,35,16,11,16,5,93,2,13,20,15,159,35,
35,35,35,20,103,159,35,16,0,16,1,33,32,10,16,5,93,2,8,89,162, 35,35,35,20,103,159,35,16,0,16,1,33,32,10,16,5,93,2,7,89,162,
8,44,36,52,9,223,0,33,33,35,20,103,159,35,16,1,20,25,159,36,2, 8,44,36,52,9,223,0,33,33,35,20,103,159,35,16,1,20,25,159,36,2,
2,2,13,16,0,11,16,5,93,2,10,89,162,8,44,36,52,9,223,0,33, 2,2,13,16,0,11,16,5,93,2,9,89,162,8,44,36,52,9,223,0,33,
34,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16,5, 34,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16,5,
93,2,12,89,162,8,44,36,52,9,223,0,33,35,35,20,103,159,35,16,1, 93,2,12,89,162,8,44,36,52,9,223,0,33,35,35,20,103,159,35,16,1,
20,25,159,36,2,2,2,13,16,1,33,36,11,16,5,93,2,5,89,162,8, 20,25,159,36,2,2,2,13,16,1,33,36,11,16,5,93,2,5,89,162,8,
44,36,55,9,223,0,33,37,35,20,103,159,35,16,1,20,25,159,36,2,2, 44,36,55,9,223,0,33,37,35,20,103,159,35,16,1,20,25,159,36,2,2,
2,13,16,1,33,38,11,16,5,93,2,3,89,162,8,44,36,57,9,223,0, 2,13,16,1,33,38,11,16,5,93,2,3,89,162,8,44,36,57,9,223,0,
33,41,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16, 33,41,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16,
5,93,2,11,89,162,8,44,36,52,9,223,0,33,43,35,20,103,159,35,16, 5,93,2,10,89,162,8,44,36,52,9,223,0,33,43,35,20,103,159,35,16,
1,20,25,159,36,2,2,2,13,16,0,11,16,5,93,2,7,89,162,8,44, 1,20,25,159,36,2,2,2,13,16,0,11,16,5,93,2,6,89,162,8,44,
36,53,9,223,0,33,44,35,20,103,159,35,16,1,20,25,159,36,2,2,2, 36,53,9,223,0,33,44,35,20,103,159,35,16,1,20,25,159,36,2,2,2,
13,16,0,11,16,5,93,2,6,89,162,8,44,36,54,9,223,0,33,45,35, 13,16,0,11,16,5,93,2,4,89,162,8,44,36,54,9,223,0,33,45,35,
20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16,5,93,2, 20,103,159,35,16,1,20,25,159,36,2,2,2,13,16,0,11,16,5,93,2,
9,89,162,8,44,36,57,9,223,0,33,46,35,20,103,159,35,16,1,20,25, 8,89,162,8,44,36,57,9,223,0,33,46,35,20,103,159,35,16,1,20,25,
159,36,2,2,2,13,16,1,33,48,11,16,5,93,2,4,89,162,8,44,36, 159,36,2,2,2,13,16,1,33,48,11,16,5,93,2,11,89,162,8,44,36,
53,9,223,0,33,49,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13, 53,9,223,0,33,49,35,20,103,159,35,16,1,20,25,159,36,2,2,2,13,
16,0,11,16,0,94,2,15,2,16,93,2,15,9,9,35,0}; 16,0,11,16,0,94,2,15,2,16,93,2,15,9,9,35,0};
EVAL_ONE_SIZED_STR((char *)expr, 2032); EVAL_ONE_SIZED_STR((char *)expr, 2032);
} }
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,60,0,0,0,1,0,0,3,0,16,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,60,0,0,0,1,0,0,3,0,16,0,
21,0,38,0,53,0,71,0,87,0,97,0,115,0,135,0,151,0,169,0,200, 21,0,38,0,53,0,71,0,87,0,97,0,115,0,135,0,151,0,169,0,200,
0,229,0,251,0,9,1,15,1,29,1,34,1,44,1,52,1,80,1,112,1, 0,229,0,251,0,9,1,15,1,29,1,34,1,44,1,52,1,80,1,112,1,
157,1,202,1,226,1,9,2,11,2,68,2,158,3,199,3,33,5,137,5,241, 157,1,202,1,226,1,9,2,11,2,68,2,158,3,199,3,33,5,137,5,241,
@ -131,177 +131,177 @@
111,114,32,98,121,116,101,32,115,116,114,105,110,103,6,36,36,99,97,110,110, 111,114,32,98,121,116,101,32,115,116,114,105,110,103,6,36,36,99,97,110,110,
111,116,32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32, 111,116,32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32,
114,111,111,116,32,112,97,116,104,58,32,5,0,27,20,14,159,80,158,36,50, 114,111,111,116,32,112,97,116,104,58,32,5,0,27,20,14,159,80,158,36,50,
250,80,158,39,51,249,22,27,11,80,158,41,50,22,170,12,10,248,22,147,5, 250,80,158,39,51,249,22,27,11,80,158,41,50,22,176,12,10,248,22,153,5,
23,196,2,28,248,22,144,6,23,194,2,12,87,94,248,22,157,8,23,194,1, 23,196,2,28,248,22,150,6,23,194,2,12,87,94,248,22,163,8,23,194,1,
248,80,159,37,53,36,195,28,248,22,71,23,195,2,9,27,248,22,64,23,196, 248,80,159,37,53,36,195,28,248,22,71,23,195,2,9,27,248,22,64,23,196,
2,27,28,248,22,151,13,23,195,2,23,194,1,28,248,22,150,13,23,195,2, 2,27,28,248,22,157,13,23,195,2,23,194,1,28,248,22,156,13,23,195,2,
249,22,152,13,23,196,1,250,80,158,42,48,248,22,166,13,2,20,11,10,250, 249,22,158,13,23,196,1,250,80,158,42,48,248,22,172,13,2,20,11,10,250,
80,158,40,48,248,22,166,13,2,20,23,197,1,10,28,23,193,2,249,22,63, 80,158,40,48,248,22,172,13,2,20,23,197,1,10,28,23,193,2,249,22,63,
248,22,154,13,249,22,152,13,23,198,1,247,22,167,13,27,248,22,65,23,200, 248,22,160,13,249,22,158,13,23,198,1,247,22,173,13,27,248,22,65,23,200,
1,28,248,22,71,23,194,2,9,27,248,22,64,23,195,2,27,28,248,22,151, 1,28,248,22,71,23,194,2,9,27,248,22,64,23,195,2,27,28,248,22,157,
13,23,195,2,23,194,1,28,248,22,150,13,23,195,2,249,22,152,13,23,196, 13,23,195,2,23,194,1,28,248,22,156,13,23,195,2,249,22,158,13,23,196,
1,250,80,158,47,48,248,22,166,13,2,20,11,10,250,80,158,45,48,248,22, 1,250,80,158,47,48,248,22,172,13,2,20,11,10,250,80,158,45,48,248,22,
166,13,2,20,23,197,1,10,28,23,193,2,249,22,63,248,22,154,13,249,22, 172,13,2,20,23,197,1,10,28,23,193,2,249,22,63,248,22,160,13,249,22,
152,13,23,198,1,247,22,167,13,248,80,159,45,52,36,248,22,65,23,199,1, 158,13,23,198,1,247,22,173,13,248,80,159,45,52,36,248,22,65,23,199,1,
87,94,23,193,1,248,80,159,43,52,36,248,22,65,23,197,1,87,94,23,193, 87,94,23,193,1,248,80,159,43,52,36,248,22,65,23,197,1,87,94,23,193,
1,27,248,22,65,23,198,1,28,248,22,71,23,194,2,9,27,248,22,64,23, 1,27,248,22,65,23,198,1,28,248,22,71,23,194,2,9,27,248,22,64,23,
195,2,27,28,248,22,151,13,23,195,2,23,194,1,28,248,22,150,13,23,195, 195,2,27,28,248,22,157,13,23,195,2,23,194,1,28,248,22,156,13,23,195,
2,249,22,152,13,23,196,1,250,80,158,45,48,248,22,166,13,2,20,11,10, 2,249,22,158,13,23,196,1,250,80,158,45,48,248,22,172,13,2,20,11,10,
250,80,158,43,48,248,22,166,13,2,20,23,197,1,10,28,23,193,2,249,22, 250,80,158,43,48,248,22,172,13,2,20,23,197,1,10,28,23,193,2,249,22,
63,248,22,154,13,249,22,152,13,23,198,1,247,22,167,13,248,80,159,43,52, 63,248,22,160,13,249,22,158,13,23,198,1,247,22,173,13,248,80,159,43,52,
36,248,22,65,23,199,1,248,80,159,41,52,36,248,22,65,196,27,248,22,191, 36,248,22,65,23,199,1,248,80,159,41,52,36,248,22,65,196,27,248,22,133,
12,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248,22,149,6,23,195, 13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248,22,155,6,23,195,
2,27,248,22,149,13,195,28,192,192,248,22,150,13,195,11,87,94,28,28,248, 2,27,248,22,155,13,195,28,192,192,248,22,156,13,195,11,87,94,28,28,248,
22,128,13,23,195,2,10,27,248,22,191,12,23,196,2,28,23,193,2,192,87, 22,134,13,23,195,2,10,27,248,22,133,13,23,196,2,28,23,193,2,192,87,
94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2,28, 94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2,28,
23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22,184, 23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22,190,
8,76,110,111,114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,42,42, 8,76,110,111,114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,42,42,
112,97,116,104,32,40,102,111,114,32,97,110,121,32,115,121,115,116,101,109,41, 112,97,116,104,32,40,102,111,114,32,97,110,121,32,115,121,115,116,101,109,41,
32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103, 32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103,
23,197,2,28,28,248,22,128,13,23,195,2,249,22,154,8,248,22,129,13,23, 23,197,2,28,28,248,22,134,13,23,195,2,249,22,160,8,248,22,135,13,23,
197,2,2,21,249,22,154,8,247,22,168,7,2,21,27,28,248,22,149,6,23, 197,2,2,21,249,22,160,8,247,22,174,7,2,21,27,28,248,22,155,6,23,
196,2,23,195,2,248,22,158,7,248,22,132,13,23,197,2,28,249,22,179,13, 196,2,23,195,2,248,22,164,7,248,22,138,13,23,197,2,28,249,22,185,13,
0,21,35,114,120,34,94,91,92,92,93,91,92,92,93,91,63,93,91,92,92, 0,21,35,114,120,34,94,91,92,92,93,91,92,92,93,91,63,93,91,92,92,
93,34,23,195,2,28,248,22,149,6,195,248,22,135,13,195,194,27,248,22,188, 93,34,23,195,2,28,248,22,155,6,195,248,22,141,13,195,194,27,248,22,130,
6,23,195,1,249,22,136,13,248,22,161,7,250,22,185,13,0,6,35,114,120, 7,23,195,1,249,22,142,13,248,22,167,7,250,22,191,13,0,6,35,114,120,
34,47,34,28,249,22,179,13,0,22,35,114,120,34,91,47,92,92,93,91,46, 34,47,34,28,249,22,185,13,0,22,35,114,120,34,91,47,92,92,93,91,46,
32,93,43,91,47,92,92,93,42,36,34,23,201,2,23,199,1,250,22,185,13, 32,93,43,91,47,92,92,93,42,36,34,23,201,2,23,199,1,250,22,191,13,
0,19,35,114,120,34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34, 0,19,35,114,120,34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34,
23,202,1,6,2,2,92,49,80,158,43,36,2,21,28,248,22,149,6,194,248, 23,202,1,6,2,2,92,49,80,158,43,36,2,21,28,248,22,155,6,194,248,
22,135,13,194,193,87,94,28,27,248,22,191,12,23,196,2,28,23,193,2,192, 22,141,13,194,193,87,94,28,27,248,22,133,13,23,196,2,28,23,193,2,192,
87,94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2, 87,94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2,
28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22, 28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22,
184,8,23,196,2,2,22,23,197,2,28,248,22,149,13,23,195,2,12,248,22, 190,8,23,196,2,2,22,23,197,2,28,248,22,155,13,23,195,2,12,248,22,
146,11,249,22,155,10,248,22,178,6,250,22,133,7,2,23,23,200,1,23,201, 152,11,249,22,161,10,248,22,184,6,250,22,139,7,2,23,23,200,1,23,201,
1,247,22,23,87,94,28,27,248,22,191,12,23,196,2,28,23,193,2,192,87, 1,247,22,23,87,94,28,27,248,22,133,13,23,196,2,28,23,193,2,192,87,
94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2,28, 94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2,28,
23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22,184, 23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22,190,
8,23,196,2,2,22,23,197,2,28,248,22,149,13,23,195,2,12,248,22,146, 8,23,196,2,2,22,23,197,2,28,248,22,155,13,23,195,2,12,248,22,152,
11,249,22,155,10,248,22,178,6,250,22,133,7,2,23,23,200,1,23,201,1, 11,249,22,161,10,248,22,184,6,250,22,139,7,2,23,23,200,1,23,201,1,
247,22,23,87,94,87,94,28,27,248,22,191,12,23,196,2,28,23,193,2,192, 247,22,23,87,94,87,94,28,27,248,22,133,13,23,196,2,28,23,193,2,192,
87,94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13,23,197,2, 87,94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,23,197,2,
28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11,12,250,22, 28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,12,250,22,
184,8,195,2,22,23,197,2,28,248,22,149,13,23,195,2,12,248,22,146,11, 190,8,195,2,22,23,197,2,28,248,22,155,13,23,195,2,12,248,22,152,11,
249,22,155,10,248,22,178,6,250,22,133,7,2,23,199,23,201,1,247,22,23, 249,22,161,10,248,22,184,6,250,22,139,7,2,23,199,23,201,1,247,22,23,
249,22,3,89,162,8,44,36,49,9,223,2,33,34,196,248,22,146,11,249,22, 249,22,3,89,162,8,44,36,49,9,223,2,33,34,196,248,22,152,11,249,22,
185,10,23,196,1,247,22,23,87,94,250,80,159,38,39,36,2,7,196,197,251, 191,10,23,196,1,247,22,23,87,94,250,80,159,38,39,36,2,7,196,197,251,
80,159,39,41,36,2,7,32,0,89,162,8,44,36,44,9,222,33,36,197,198, 80,159,39,41,36,2,7,32,0,89,162,8,44,36,44,9,222,33,36,197,198,
32,38,89,162,43,41,58,65,99,108,111,111,112,222,33,39,28,248,22,71,23, 32,38,89,162,43,41,58,65,99,108,111,111,112,222,33,39,28,248,22,71,23,
199,2,87,94,23,198,1,248,23,196,1,251,22,133,7,2,24,23,199,1,28, 199,2,87,94,23,198,1,248,23,196,1,251,22,139,7,2,24,23,199,1,28,
248,22,71,23,203,2,87,94,23,202,1,23,201,1,250,22,1,22,145,13,23, 248,22,71,23,203,2,87,94,23,202,1,23,201,1,250,22,1,22,151,13,23,
204,1,23,205,1,23,198,1,27,249,22,145,13,248,22,64,23,202,2,23,199, 204,1,23,205,1,23,198,1,27,249,22,151,13,248,22,64,23,202,2,23,199,
2,28,248,22,140,13,23,194,2,27,250,22,1,22,145,13,23,197,1,23,202, 2,28,248,22,146,13,23,194,2,27,250,22,1,22,151,13,23,197,1,23,202,
2,28,248,22,140,13,23,194,2,192,87,94,23,193,1,27,248,22,65,23,202, 2,28,248,22,146,13,23,194,2,192,87,94,23,193,1,27,248,22,65,23,202,
1,28,248,22,71,23,194,2,87,94,23,193,1,248,23,199,1,251,22,133,7, 1,28,248,22,71,23,194,2,87,94,23,193,1,248,23,199,1,251,22,139,7,
2,24,23,202,1,28,248,22,71,23,206,2,87,94,23,205,1,23,204,1,250, 2,24,23,202,1,28,248,22,71,23,206,2,87,94,23,205,1,23,204,1,250,
22,1,22,145,13,23,207,1,23,208,1,23,201,1,27,249,22,145,13,248,22, 22,1,22,151,13,23,207,1,23,208,1,23,201,1,27,249,22,151,13,248,22,
64,23,197,2,23,202,2,28,248,22,140,13,23,194,2,27,250,22,1,22,145, 64,23,197,2,23,202,2,28,248,22,146,13,23,194,2,27,250,22,1,22,151,
13,23,197,1,204,28,248,22,140,13,193,192,253,2,38,203,204,205,206,23,15, 13,23,197,1,204,28,248,22,146,13,193,192,253,2,38,203,204,205,206,23,15,
248,22,65,201,253,2,38,202,203,204,205,206,248,22,65,200,87,94,23,193,1, 248,22,65,201,253,2,38,202,203,204,205,206,248,22,65,200,87,94,23,193,1,
27,248,22,65,23,201,1,28,248,22,71,23,194,2,87,94,23,193,1,248,23, 27,248,22,65,23,201,1,28,248,22,71,23,194,2,87,94,23,193,1,248,23,
198,1,251,22,133,7,2,24,23,201,1,28,248,22,71,23,205,2,87,94,23, 198,1,251,22,139,7,2,24,23,201,1,28,248,22,71,23,205,2,87,94,23,
204,1,23,203,1,250,22,1,22,145,13,23,206,1,23,207,1,23,200,1,27, 204,1,23,203,1,250,22,1,22,151,13,23,206,1,23,207,1,23,200,1,27,
249,22,145,13,248,22,64,23,197,2,23,201,2,28,248,22,140,13,23,194,2, 249,22,151,13,248,22,64,23,197,2,23,201,2,28,248,22,146,13,23,194,2,
27,250,22,1,22,145,13,23,197,1,203,28,248,22,140,13,193,192,253,2,38, 27,250,22,1,22,151,13,23,197,1,203,28,248,22,146,13,193,192,253,2,38,
202,203,204,205,206,248,22,65,201,253,2,38,201,202,203,204,205,248,22,65,200, 202,203,204,205,206,248,22,65,201,253,2,38,201,202,203,204,205,248,22,65,200,
27,247,22,168,13,253,2,38,198,199,200,201,202,198,87,95,28,28,248,22,128, 27,247,22,174,13,253,2,38,198,199,200,201,202,198,87,95,28,28,248,22,134,
13,23,194,2,10,27,248,22,191,12,23,195,2,28,23,193,2,192,87,94,23, 13,23,194,2,10,27,248,22,133,13,23,195,2,28,23,193,2,192,87,94,23,
193,1,28,248,22,149,6,23,195,2,27,248,22,149,13,23,196,2,28,23,193, 193,1,28,248,22,155,6,23,195,2,27,248,22,155,13,23,196,2,28,23,193,
2,192,87,94,23,193,1,248,22,150,13,23,196,2,11,12,252,22,184,8,23, 2,192,87,94,23,193,1,248,22,156,13,23,196,2,11,12,252,22,190,8,23,
200,2,2,25,35,23,198,2,23,199,2,28,28,248,22,149,6,23,195,2,10, 200,2,2,25,35,23,198,2,23,199,2,28,28,248,22,155,6,23,195,2,10,
248,22,137,7,23,195,2,87,94,23,194,1,12,252,22,184,8,23,200,2,2, 248,22,143,7,23,195,2,87,94,23,194,1,12,252,22,190,8,23,200,2,2,
26,36,23,198,2,23,199,1,91,159,38,11,90,161,38,35,11,248,22,148,13, 26,36,23,198,2,23,199,1,91,159,38,11,90,161,38,35,11,248,22,154,13,
23,197,2,87,94,23,195,1,87,94,28,192,12,250,22,185,8,23,201,1,2, 23,197,2,87,94,23,195,1,87,94,28,192,12,250,22,191,8,23,201,1,2,
27,23,199,1,249,22,7,194,195,91,159,37,11,90,161,37,35,11,87,95,28, 27,23,199,1,249,22,7,194,195,91,159,37,11,90,161,37,35,11,87,95,28,
28,248,22,128,13,23,196,2,10,27,248,22,191,12,23,197,2,28,23,193,2, 28,248,22,134,13,23,196,2,10,27,248,22,133,13,23,197,2,28,23,193,2,
192,87,94,23,193,1,28,248,22,149,6,23,197,2,27,248,22,149,13,23,198, 192,87,94,23,193,1,28,248,22,155,6,23,197,2,27,248,22,155,13,23,198,
2,28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,198,2,11,12,252, 2,28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,198,2,11,12,252,
22,184,8,2,10,2,25,35,23,200,2,23,201,2,28,28,248,22,149,6,23, 22,190,8,2,10,2,25,35,23,200,2,23,201,2,28,28,248,22,155,6,23,
197,2,10,248,22,137,7,23,197,2,12,252,22,184,8,2,10,2,26,36,23, 197,2,10,248,22,143,7,23,197,2,12,252,22,190,8,2,10,2,26,36,23,
200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22,148,13,23,199,2, 200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22,154,13,23,199,2,
87,94,23,195,1,87,94,28,23,193,2,12,250,22,185,8,2,10,2,27,23, 87,94,23,195,1,87,94,28,23,193,2,12,250,22,191,8,2,10,2,27,23,
201,2,249,22,7,23,195,1,23,196,1,27,249,22,137,13,250,22,184,13,0, 201,2,249,22,7,23,195,1,23,196,1,27,249,22,143,13,250,22,190,13,0,
18,35,114,120,35,34,40,91,46,93,91,94,46,93,42,124,41,36,34,248,22, 18,35,114,120,35,34,40,91,46,93,91,94,46,93,42,124,41,36,34,248,22,
133,13,23,201,1,28,248,22,149,6,23,203,2,249,22,161,7,23,204,1,8, 139,13,23,201,1,28,248,22,155,6,23,203,2,249,22,167,7,23,204,1,8,
63,23,202,1,28,248,22,128,13,23,199,2,248,22,129,13,23,199,1,87,94, 63,23,202,1,28,248,22,134,13,23,199,2,248,22,135,13,23,199,1,87,94,
23,198,1,247,22,130,13,28,248,22,191,12,194,249,22,145,13,195,194,192,91, 23,198,1,247,22,136,13,28,248,22,133,13,194,249,22,151,13,195,194,192,91,
159,37,11,90,161,37,35,11,87,95,28,28,248,22,128,13,23,196,2,10,27, 159,37,11,90,161,37,35,11,87,95,28,28,248,22,134,13,23,196,2,10,27,
248,22,191,12,23,197,2,28,23,193,2,192,87,94,23,193,1,28,248,22,149, 248,22,133,13,23,197,2,28,23,193,2,192,87,94,23,193,1,28,248,22,155,
6,23,197,2,27,248,22,149,13,23,198,2,28,23,193,2,192,87,94,23,193, 6,23,197,2,27,248,22,155,13,23,198,2,28,23,193,2,192,87,94,23,193,
1,248,22,150,13,23,198,2,11,12,252,22,184,8,2,11,2,25,35,23,200, 1,248,22,156,13,23,198,2,11,12,252,22,190,8,2,11,2,25,35,23,200,
2,23,201,2,28,28,248,22,149,6,23,197,2,10,248,22,137,7,23,197,2, 2,23,201,2,28,28,248,22,155,6,23,197,2,10,248,22,143,7,23,197,2,
12,252,22,184,8,2,11,2,26,36,23,200,2,23,201,2,91,159,38,11,90, 12,252,22,190,8,2,11,2,26,36,23,200,2,23,201,2,91,159,38,11,90,
161,38,35,11,248,22,148,13,23,199,2,87,94,23,195,1,87,94,28,23,193, 161,38,35,11,248,22,154,13,23,199,2,87,94,23,195,1,87,94,28,23,193,
2,12,250,22,185,8,2,11,2,27,23,201,2,249,22,7,23,195,1,23,196, 2,12,250,22,191,8,2,11,2,27,23,201,2,249,22,7,23,195,1,23,196,
1,27,249,22,137,13,249,22,147,7,250,22,185,13,0,9,35,114,120,35,34, 1,27,249,22,143,13,249,22,153,7,250,22,191,13,0,9,35,114,120,35,34,
91,46,93,34,248,22,133,13,23,203,1,6,1,1,95,28,248,22,149,6,23, 91,46,93,34,248,22,139,13,23,203,1,6,1,1,95,28,248,22,155,6,23,
202,2,249,22,161,7,23,203,1,8,63,23,201,1,28,248,22,128,13,23,199, 202,2,249,22,167,7,23,203,1,8,63,23,201,1,28,248,22,134,13,23,199,
2,248,22,129,13,23,199,1,87,94,23,198,1,247,22,130,13,28,248,22,191, 2,248,22,135,13,23,199,1,87,94,23,198,1,247,22,136,13,28,248,22,133,
12,194,249,22,145,13,195,194,192,249,247,22,180,4,194,11,249,80,158,37,46, 13,194,249,22,151,13,195,194,192,249,247,22,186,4,194,11,249,80,158,37,46,
9,9,249,80,158,37,46,195,9,27,247,22,170,13,249,80,158,38,47,28,23, 9,9,249,80,158,37,46,195,9,27,247,22,176,13,249,80,158,38,47,28,23,
195,2,27,248,22,166,7,6,11,11,80,76,84,67,79,76,76,69,67,84,83, 195,2,27,248,22,172,7,6,11,11,80,76,84,67,79,76,76,69,67,84,83,
28,192,192,6,0,0,6,0,0,27,28,23,196,1,250,22,145,13,248,22,166, 28,192,192,6,0,0,6,0,0,27,28,23,196,1,250,22,151,13,248,22,172,
13,69,97,100,100,111,110,45,100,105,114,247,22,164,7,6,8,8,99,111,108, 13,69,97,100,100,111,110,45,100,105,114,247,22,170,7,6,8,8,99,111,108,
108,101,99,116,115,11,27,248,80,159,41,52,36,250,22,77,23,203,1,248,22, 108,101,99,116,115,11,27,248,80,159,41,52,36,250,22,77,23,203,1,248,22,
73,248,22,166,13,72,99,111,108,108,101,99,116,115,45,100,105,114,23,204,1, 73,248,22,172,13,72,99,111,108,108,101,99,116,115,45,100,105,114,23,204,1,
28,23,194,2,249,22,63,23,196,1,23,195,1,192,32,48,89,162,8,44,38, 28,23,194,2,249,22,63,23,196,1,23,195,1,192,32,48,89,162,8,44,38,
54,2,19,222,33,49,27,249,22,177,13,23,197,2,23,198,2,28,23,193,2, 54,2,19,222,33,49,27,249,22,183,13,23,197,2,23,198,2,28,23,193,2,
87,94,23,196,1,27,248,22,88,23,195,2,27,27,248,22,97,23,197,1,27, 87,94,23,196,1,27,248,22,88,23,195,2,27,27,248,22,97,23,197,1,27,
249,22,177,13,23,201,2,23,196,2,28,23,193,2,87,94,23,194,1,27,248, 249,22,183,13,23,201,2,23,196,2,28,23,193,2,87,94,23,194,1,27,248,
22,88,23,195,2,27,250,2,48,23,203,2,23,204,1,248,22,97,23,199,1, 22,88,23,195,2,27,250,2,48,23,203,2,23,204,1,248,22,97,23,199,1,
28,249,22,143,7,23,196,2,2,28,249,22,77,23,202,2,194,249,22,63,248, 28,249,22,149,7,23,196,2,2,28,249,22,77,23,202,2,194,249,22,63,248,
22,136,13,23,197,1,23,195,1,87,95,23,199,1,23,193,1,28,249,22,143, 22,142,13,23,197,1,23,195,1,87,95,23,199,1,23,193,1,28,249,22,149,
7,23,196,2,2,28,249,22,77,23,200,2,9,249,22,63,248,22,136,13,23, 7,23,196,2,2,28,249,22,77,23,200,2,9,249,22,63,248,22,142,13,23,
197,1,9,28,249,22,143,7,23,196,2,2,28,249,22,77,197,194,87,94,23, 197,1,9,28,249,22,149,7,23,196,2,2,28,249,22,77,197,194,87,94,23,
196,1,249,22,63,248,22,136,13,23,197,1,194,87,94,23,193,1,28,249,22, 196,1,249,22,63,248,22,142,13,23,197,1,194,87,94,23,193,1,28,249,22,
143,7,23,198,2,2,28,249,22,77,195,9,87,94,23,194,1,249,22,63,248, 149,7,23,198,2,2,28,249,22,77,195,9,87,94,23,194,1,249,22,63,248,
22,136,13,23,199,1,9,87,95,28,28,248,22,137,7,194,10,248,22,149,6, 22,142,13,23,199,1,9,87,95,28,28,248,22,143,7,194,10,248,22,155,6,
194,12,250,22,184,8,2,14,6,21,21,98,121,116,101,32,115,116,114,105,110, 194,12,250,22,190,8,2,14,6,21,21,98,121,116,101,32,115,116,114,105,110,
103,32,111,114,32,115,116,114,105,110,103,196,28,28,248,22,72,195,249,22,4, 103,32,111,114,32,115,116,114,105,110,103,196,28,28,248,22,72,195,249,22,4,
22,191,12,196,11,12,250,22,184,8,2,14,6,13,13,108,105,115,116,32,111, 22,133,13,196,11,12,250,22,190,8,2,14,6,13,13,108,105,115,116,32,111,
102,32,112,97,116,104,115,197,250,2,48,197,195,28,248,22,149,6,197,248,22, 102,32,112,97,116,104,115,197,250,2,48,197,195,28,248,22,155,6,197,248,22,
160,7,197,196,32,51,89,162,8,44,39,57,2,19,222,33,54,32,52,89,162, 166,7,197,196,32,51,89,162,8,44,39,57,2,19,222,33,54,32,52,89,162,
8,44,38,54,70,102,111,117,110,100,45,101,120,101,99,222,33,53,28,23,193, 8,44,38,54,70,102,111,117,110,100,45,101,120,101,99,222,33,53,28,23,193,
2,91,159,38,11,90,161,38,35,11,248,22,148,13,23,199,2,87,95,23,195, 2,91,159,38,11,90,161,38,35,11,248,22,154,13,23,199,2,87,95,23,195,
1,23,194,1,27,28,23,198,2,27,248,22,153,13,23,201,2,28,249,22,156, 1,23,194,1,27,28,23,198,2,27,248,22,159,13,23,201,2,28,249,22,162,
8,23,195,2,23,202,2,11,28,248,22,149,13,23,194,2,250,2,52,23,201, 8,23,195,2,23,202,2,11,28,248,22,155,13,23,194,2,250,2,52,23,201,
2,23,202,2,249,22,145,13,23,200,2,23,198,1,250,2,52,23,201,2,23, 2,23,202,2,249,22,151,13,23,200,2,23,198,1,250,2,52,23,201,2,23,
202,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,191, 202,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,133,
12,23,196,2,27,249,22,145,13,23,198,2,23,201,2,28,28,248,22,140,13, 13,23,196,2,27,249,22,151,13,23,198,2,23,201,2,28,28,248,22,146,13,
193,10,248,22,139,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28, 193,10,248,22,145,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28,
23,199,2,11,27,248,22,153,13,23,202,2,28,249,22,156,8,23,195,2,23, 23,199,2,11,27,248,22,159,13,23,202,2,28,249,22,162,8,23,195,2,23,
203,1,11,28,248,22,149,13,23,194,2,250,2,52,23,202,1,23,203,1,249, 203,1,11,28,248,22,155,13,23,194,2,250,2,52,23,202,1,23,203,1,249,
22,145,13,23,201,1,23,198,1,250,2,52,201,202,195,194,28,248,22,71,23, 22,151,13,23,201,1,23,198,1,250,2,52,201,202,195,194,28,248,22,71,23,
197,2,11,27,248,22,152,13,248,22,64,23,199,2,27,249,22,145,13,23,196, 197,2,11,27,248,22,158,13,248,22,64,23,199,2,27,249,22,151,13,23,196,
1,23,197,2,28,248,22,139,13,23,194,2,250,2,52,198,199,195,87,94,23, 1,23,197,2,28,248,22,145,13,23,194,2,250,2,52,198,199,195,87,94,23,
193,1,27,248,22,65,23,200,1,28,248,22,71,23,194,2,11,27,248,22,152, 193,1,27,248,22,65,23,200,1,28,248,22,71,23,194,2,11,27,248,22,158,
13,248,22,64,23,196,2,27,249,22,145,13,23,196,1,23,200,2,28,248,22, 13,248,22,64,23,196,2,27,249,22,151,13,23,196,1,23,200,2,28,248,22,
139,13,23,194,2,250,2,52,201,202,195,87,94,23,193,1,27,248,22,65,23, 145,13,23,194,2,250,2,52,201,202,195,87,94,23,193,1,27,248,22,65,23,
197,1,28,248,22,71,23,194,2,11,27,248,22,152,13,248,22,64,195,27,249, 197,1,28,248,22,71,23,194,2,11,27,248,22,158,13,248,22,64,195,27,249,
22,145,13,23,196,1,202,28,248,22,139,13,193,250,2,52,204,205,195,251,2, 22,151,13,23,196,1,202,28,248,22,145,13,193,250,2,52,204,205,195,251,2,
51,204,205,206,248,22,65,199,87,95,28,27,248,22,191,12,23,196,2,28,23, 51,204,205,206,248,22,65,199,87,95,28,27,248,22,133,13,23,196,2,28,23,
193,2,192,87,94,23,193,1,28,248,22,149,6,23,196,2,27,248,22,149,13, 193,2,192,87,94,23,193,1,28,248,22,155,6,23,196,2,27,248,22,155,13,
23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,150,13,23,197,2,11, 23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,156,13,23,197,2,11,
12,250,22,184,8,2,15,6,25,25,112,97,116,104,32,111,114,32,115,116,114, 12,250,22,190,8,2,15,6,25,25,112,97,116,104,32,111,114,32,115,116,114,
105,110,103,32,40,115,97,110,115,32,110,117,108,41,23,197,2,28,28,23,195, 105,110,103,32,40,115,97,110,115,32,110,117,108,41,23,197,2,28,28,23,195,
2,28,27,248,22,191,12,23,197,2,28,23,193,2,192,87,94,23,193,1,28, 2,28,27,248,22,133,13,23,197,2,28,23,193,2,192,87,94,23,193,1,28,
248,22,149,6,23,197,2,27,248,22,149,13,23,198,2,28,23,193,2,192,87, 248,22,155,6,23,197,2,27,248,22,155,13,23,198,2,28,23,193,2,192,87,
94,23,193,1,248,22,150,13,23,198,2,11,248,22,149,13,23,196,2,11,10, 94,23,193,1,248,22,156,13,23,198,2,11,248,22,155,13,23,196,2,11,10,
12,250,22,184,8,2,15,6,29,29,35,102,32,111,114,32,114,101,108,97,116, 12,250,22,190,8,2,15,6,29,29,35,102,32,111,114,32,114,101,108,97,116,
105,118,101,32,112,97,116,104,32,111,114,32,115,116,114,105,110,103,23,198,2, 105,118,101,32,112,97,116,104,32,111,114,32,115,116,114,105,110,103,23,198,2,
28,28,248,22,149,13,23,195,2,91,159,38,11,90,161,38,35,11,248,22,148, 28,28,248,22,155,13,23,195,2,91,159,38,11,90,161,38,35,11,248,22,154,
13,23,198,2,249,22,154,8,194,68,114,101,108,97,116,105,118,101,11,27,248, 13,23,198,2,249,22,160,8,194,68,114,101,108,97,116,105,118,101,11,27,248,
22,166,7,6,4,4,80,65,84,72,251,2,51,23,199,1,23,200,1,23,201, 22,172,7,6,4,4,80,65,84,72,251,2,51,23,199,1,23,200,1,23,201,
1,28,23,197,2,27,249,80,158,43,47,23,200,1,9,28,249,22,154,8,247, 1,28,23,197,2,27,249,80,158,43,47,23,200,1,9,28,249,22,160,8,247,
22,168,7,2,21,249,22,63,248,22,136,13,5,1,46,23,195,1,192,9,27, 22,174,7,2,21,249,22,63,248,22,142,13,5,1,46,23,195,1,192,9,27,
248,22,152,13,23,196,1,28,248,22,139,13,193,250,2,52,198,199,195,11,250, 248,22,158,13,23,196,1,28,248,22,145,13,193,250,2,52,198,199,195,11,250,
80,158,38,48,196,197,11,250,80,158,38,48,196,11,11,87,94,249,22,140,6, 80,158,38,48,196,197,11,250,80,158,38,48,196,11,11,87,94,249,22,146,6,
247,22,176,4,195,248,22,166,5,249,22,163,3,35,249,22,147,3,197,198,27, 247,22,182,4,195,248,22,172,5,249,22,169,3,35,249,22,153,3,197,198,27,
28,23,197,2,87,95,23,196,1,23,195,1,23,197,1,87,94,23,197,1,27, 28,23,197,2,87,95,23,196,1,23,195,1,23,197,1,87,94,23,197,1,27,
248,22,166,13,2,20,27,249,80,158,40,48,23,196,1,11,27,27,248,22,166, 248,22,172,13,2,20,27,249,80,158,40,48,23,196,1,11,27,27,248,22,172,
3,23,200,1,28,192,192,35,27,27,248,22,166,3,23,202,1,28,192,192,35, 3,23,200,1,28,192,192,35,27,27,248,22,172,3,23,202,1,28,192,192,35,
249,22,143,5,23,197,1,83,158,39,20,97,95,89,162,8,44,35,47,9,224, 249,22,149,5,23,197,1,83,158,39,20,97,95,89,162,8,44,35,47,9,224,
3,2,33,58,23,195,1,23,196,1,27,248,22,128,5,23,195,1,248,80,159, 3,2,33,58,23,195,1,23,196,1,27,248,22,134,5,23,195,1,248,80,159,
38,53,36,193,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83, 38,53,36,193,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83,
158,41,20,100,138,67,35,37,117,116,105,108,115,2,1,11,11,10,10,42,80, 158,41,20,100,138,67,35,37,117,116,105,108,115,2,1,11,11,10,10,42,80,
158,35,35,20,103,159,37,16,17,30,2,1,2,2,193,30,2,1,2,3,193, 158,35,35,20,103,159,37,16,17,30,2,1,2,2,193,30,2,1,2,3,193,
@ -319,7 +319,7 @@
0,16,0,16,0,35,35,16,0,16,17,83,158,35,16,2,89,162,43,36,48, 0,16,0,16,0,35,35,16,0,16,17,83,158,35,16,2,89,162,43,36,48,
2,19,223,0,33,29,80,159,35,53,36,83,158,35,16,2,89,162,8,44,36, 2,19,223,0,33,29,80,159,35,53,36,83,158,35,16,2,89,162,8,44,36,
55,2,19,223,0,33,30,80,159,35,52,36,83,158,35,16,2,32,0,89,162, 55,2,19,223,0,33,30,80,159,35,52,36,83,158,35,16,2,32,0,89,162,
43,36,44,2,2,222,33,31,80,159,35,35,36,83,158,35,16,2,249,22,151, 43,36,44,2,2,222,33,31,80,159,35,35,36,83,158,35,16,2,249,22,157,
6,7,92,7,92,80,159,35,36,36,83,158,35,16,2,89,162,43,36,53,2, 6,7,92,7,92,80,159,35,36,36,83,158,35,16,2,89,162,43,36,53,2,
4,223,0,33,32,80,159,35,37,36,83,158,35,16,2,32,0,89,162,8,44, 4,223,0,33,32,80,159,35,37,36,83,158,35,16,2,32,0,89,162,8,44,
37,49,2,5,222,33,33,80,159,35,38,36,83,158,35,16,2,32,0,89,162, 37,49,2,5,222,33,33,80,159,35,38,36,83,158,35,16,2,32,0,89,162,
@ -332,8 +332,8 @@
35,16,2,32,0,89,162,43,36,43,2,12,222,33,44,80,159,35,45,36,83, 35,16,2,32,0,89,162,43,36,43,2,12,222,33,44,80,159,35,45,36,83,
158,35,16,2,83,158,38,20,96,96,2,13,89,162,43,35,43,9,223,0,33, 158,35,16,2,83,158,38,20,96,96,2,13,89,162,43,35,43,9,223,0,33,
45,89,162,43,36,44,9,223,0,33,46,89,162,43,37,54,9,223,0,33,47, 45,89,162,43,36,44,9,223,0,33,46,89,162,43,37,54,9,223,0,33,47,
80,159,35,46,36,83,158,35,16,2,27,248,22,173,13,248,22,160,7,27,28, 80,159,35,46,36,83,158,35,16,2,27,248,22,179,13,248,22,166,7,27,28,
249,22,154,8,247,22,168,7,2,21,6,1,1,59,6,1,1,58,250,22,133, 249,22,160,8,247,22,174,7,2,21,6,1,1,59,6,1,1,58,250,22,139,
7,6,14,14,40,91,94,126,97,93,42,41,126,97,40,46,42,41,23,196,2, 7,6,14,14,40,91,94,126,97,93,42,41,126,97,40,46,42,41,23,196,2,
23,196,1,89,162,8,44,37,47,2,14,223,0,33,50,80,159,35,47,36,83, 23,196,1,89,162,8,44,37,47,2,14,223,0,33,50,80,159,35,47,36,83,
158,35,16,2,83,158,38,20,96,96,2,15,89,162,8,44,38,53,9,223,0, 158,35,16,2,83,158,38,20,96,96,2,15,89,162,8,44,38,53,9,223,0,
@ -344,12 +344,12 @@
EVAL_ONE_SIZED_STR((char *)expr, 5080); EVAL_ONE_SIZED_STR((char *)expr, 5080);
} }
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,8,0,0,0,1,0,0,6,0,19,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,8,0,0,0,1,0,0,6,0,19,0,
34,0,48,0,62,0,76,0,111,0,0,0,255,0,0,0,65,113,117,111,116, 34,0,48,0,62,0,76,0,111,0,0,0,255,0,0,0,65,113,117,111,116,
101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35,37, 101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35,37,
110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122, 110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122,
11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68,35, 11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68,35,
37,107,101,114,110,101,108,11,98,10,35,11,8,176,229,97,159,2,2,35,35, 37,107,101,114,110,101,108,11,98,10,35,11,8,188,229,97,159,2,2,35,35,
159,2,3,35,35,159,2,4,35,35,159,2,5,35,35,159,2,6,35,35,16, 159,2,3,35,35,159,2,4,35,35,159,2,5,35,35,159,2,6,35,35,16,
0,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83,158,41,20, 0,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83,158,41,20,
100,138,69,35,37,98,117,105,108,116,105,110,29,11,11,11,10,10,18,96,11, 100,138,69,35,37,98,117,105,108,116,105,110,29,11,11,11,10,10,18,96,11,
@ -361,7 +361,7 @@
EVAL_ONE_SIZED_STR((char *)expr, 292); EVAL_ONE_SIZED_STR((char *)expr, 292);
} }
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,49,52,0,0,0,1,0,0,3,0,14,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,49,46,50,52,0,0,0,1,0,0,3,0,14,0,
41,0,47,0,60,0,74,0,96,0,122,0,134,0,152,0,172,0,184,0,200, 41,0,47,0,60,0,74,0,96,0,122,0,134,0,152,0,172,0,184,0,200,
0,223,0,3,1,8,1,13,1,18,1,23,1,54,1,58,1,66,1,74,1, 0,223,0,3,1,8,1,13,1,18,1,23,1,54,1,58,1,66,1,74,1,
82,1,185,1,230,1,250,1,29,2,64,2,98,2,108,2,155,2,165,2,172, 82,1,185,1,230,1,250,1,29,2,64,2,98,2,108,2,155,2,165,2,172,
@ -383,48 +383,48 @@
64,108,111,111,112,1,29,115,116,97,110,100,97,114,100,45,109,111,100,117,108, 64,108,111,111,112,1,29,115,116,97,110,100,97,114,100,45,109,111,100,117,108,
101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,63,108,105,98,67,105, 101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,63,108,105,98,67,105,
103,110,111,114,101,100,249,22,14,195,80,158,37,45,249,80,159,37,48,36,195, 103,110,111,114,101,100,249,22,14,195,80,158,37,45,249,80,159,37,48,36,195,
10,27,28,23,195,2,28,249,22,154,8,23,197,2,80,158,38,46,87,94,23, 10,27,28,23,195,2,28,249,22,160,8,23,197,2,80,158,38,46,87,94,23,
195,1,80,158,36,47,27,248,22,163,4,23,197,2,28,248,22,191,12,23,194, 195,1,80,158,36,47,27,248,22,169,4,23,197,2,28,248,22,133,13,23,194,
2,91,159,38,11,90,161,38,35,11,248,22,148,13,23,197,1,87,95,83,160, 2,91,159,38,11,90,161,38,35,11,248,22,154,13,23,197,1,87,95,83,160,
37,11,80,158,40,46,198,83,160,37,11,80,158,40,47,192,192,11,11,28,23, 37,11,80,158,40,46,198,83,160,37,11,80,158,40,47,192,192,11,11,28,23,
193,2,192,87,94,23,193,1,27,247,22,181,4,28,192,192,247,22,167,13,20, 193,2,192,87,94,23,193,1,27,247,22,187,4,28,192,192,247,22,173,13,20,
14,159,80,158,35,39,250,80,158,38,40,249,22,27,11,80,158,40,39,22,181, 14,159,80,158,35,39,250,80,158,38,40,249,22,27,11,80,158,40,39,22,187,
4,28,248,22,191,12,23,198,2,23,197,1,87,94,23,197,1,247,22,167,13, 4,28,248,22,133,13,23,198,2,23,197,1,87,94,23,197,1,247,22,173,13,
247,194,250,22,145,13,23,197,1,23,199,1,249,80,158,42,38,23,198,1,2, 247,194,250,22,151,13,23,197,1,23,199,1,249,80,158,42,38,23,198,1,2,
18,252,22,145,13,23,199,1,23,201,1,6,6,6,110,97,116,105,118,101,247, 18,252,22,151,13,23,199,1,23,201,1,6,6,6,110,97,116,105,118,101,247,
22,169,7,249,80,158,44,38,23,200,1,80,158,44,35,87,94,23,194,1,27, 22,175,7,249,80,158,44,38,23,200,1,80,158,44,35,87,94,23,194,1,27,
23,194,1,27,250,22,162,13,196,11,32,0,89,162,8,44,35,40,9,222,11, 23,194,1,27,250,22,168,13,196,11,32,0,89,162,8,44,35,40,9,222,11,
28,192,249,22,63,195,194,11,27,248,23,195,1,23,196,1,27,250,22,162,13, 28,192,249,22,63,195,194,11,27,248,23,195,1,23,196,1,27,250,22,168,13,
196,11,32,0,89,162,8,44,35,40,9,222,11,28,192,249,22,63,195,194,11, 196,11,32,0,89,162,8,44,35,40,9,222,11,28,192,249,22,63,195,194,11,
249,247,22,172,13,248,22,64,195,195,27,250,22,145,13,23,198,1,23,200,1, 249,247,22,178,13,248,22,64,195,195,27,250,22,151,13,23,198,1,23,200,1,
249,80,158,43,38,23,199,1,2,18,27,250,22,162,13,196,11,32,0,89,162, 249,80,158,43,38,23,199,1,2,18,27,250,22,168,13,196,11,32,0,89,162,
8,44,35,40,9,222,11,28,192,249,22,63,195,194,11,249,247,22,179,4,248, 8,44,35,40,9,222,11,28,192,249,22,63,195,194,11,249,247,22,185,4,248,
22,64,195,195,249,247,22,179,4,194,195,87,94,28,248,80,158,36,37,23,195, 22,64,195,195,249,247,22,185,4,194,195,87,94,28,248,80,158,36,37,23,195,
2,12,250,22,184,8,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105, 2,12,250,22,190,8,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,
108,101,100,6,25,25,112,97,116,104,32,111,114,32,118,97,108,105,100,45,112, 108,101,100,6,25,25,112,97,116,104,32,111,114,32,118,97,108,105,100,45,112,
97,116,104,32,115,116,114,105,110,103,23,197,2,91,159,41,11,90,161,36,35, 97,116,104,32,115,116,114,105,110,103,23,197,2,91,159,41,11,90,161,36,35,
11,28,248,22,151,13,23,201,2,23,200,1,27,247,22,181,4,28,23,193,2, 11,28,248,22,157,13,23,201,2,23,200,1,27,247,22,187,4,28,23,193,2,
249,22,152,13,23,203,1,23,195,1,200,90,161,38,36,11,248,22,148,13,23, 249,22,158,13,23,203,1,23,195,1,200,90,161,38,36,11,248,22,154,13,23,
194,2,87,94,23,196,1,90,161,36,39,11,28,249,22,154,8,23,196,2,68, 194,2,87,94,23,196,1,90,161,36,39,11,28,249,22,160,8,23,196,2,68,
114,101,108,97,116,105,118,101,87,94,23,194,1,2,17,23,194,1,90,161,36, 114,101,108,97,116,105,118,101,87,94,23,194,1,2,17,23,194,1,90,161,36,
40,11,247,22,169,13,27,89,162,43,36,49,62,122,111,225,7,5,3,33,27, 40,11,247,22,175,13,27,89,162,43,36,49,62,122,111,225,7,5,3,33,27,
27,89,162,43,36,51,9,225,8,6,4,33,28,27,249,22,5,89,162,8,44, 27,89,162,43,36,51,9,225,8,6,4,33,28,27,249,22,5,89,162,8,44,
36,47,9,223,5,33,29,23,203,2,27,28,23,195,2,27,249,22,5,83,158, 36,47,9,223,5,33,29,23,203,2,27,28,23,195,2,27,249,22,5,83,158,
39,20,97,94,89,162,8,44,36,47,9,223,5,33,30,23,198,1,23,205,2, 39,20,97,94,89,162,8,44,36,47,9,223,5,33,30,23,198,1,23,205,2,
27,28,23,196,2,11,193,28,192,192,28,193,28,23,196,2,28,249,22,159,3, 27,28,23,196,2,11,193,28,192,192,28,193,28,23,196,2,28,249,22,165,3,
248,22,65,196,248,22,65,23,199,2,193,11,11,11,87,94,23,195,1,11,28, 248,22,65,196,248,22,65,23,199,2,193,11,11,11,87,94,23,195,1,11,28,
23,193,2,249,80,159,47,54,36,202,89,162,43,35,45,9,224,14,2,33,31, 23,193,2,249,80,159,47,54,36,202,89,162,43,35,45,9,224,14,2,33,31,
87,94,23,193,1,27,28,23,197,1,27,249,22,5,83,158,39,20,97,94,89, 87,94,23,193,1,27,28,23,197,1,27,249,22,5,83,158,39,20,97,94,89,
162,8,44,36,50,9,225,14,12,10,33,32,23,203,1,23,206,1,27,28,196, 162,8,44,36,50,9,225,14,12,10,33,32,23,203,1,23,206,1,27,28,196,
11,193,28,192,192,28,193,28,196,28,249,22,159,3,248,22,65,196,248,22,65, 11,193,28,192,192,28,193,28,196,28,249,22,165,3,248,22,65,196,248,22,65,
199,193,11,11,11,11,28,192,249,80,159,48,54,36,203,89,162,43,35,45,9, 199,193,11,11,11,11,28,192,249,80,159,48,54,36,203,89,162,43,35,45,9,
224,15,2,33,33,249,80,159,48,54,36,203,89,162,43,35,44,9,224,15,7, 224,15,2,33,33,249,80,159,48,54,36,203,89,162,43,35,44,9,224,15,7,
33,34,32,36,89,162,8,44,36,54,2,19,222,33,38,0,17,35,114,120,34, 33,34,32,36,89,162,8,44,36,54,2,19,222,33,38,0,17,35,114,120,34,
94,40,46,42,63,41,47,40,46,42,41,36,34,27,249,22,177,13,2,37,23, 94,40,46,42,63,41,47,40,46,42,41,36,34,27,249,22,183,13,2,37,23,
196,2,28,23,193,2,87,94,23,194,1,249,22,63,248,22,88,23,196,2,27, 196,2,28,23,193,2,87,94,23,194,1,249,22,63,248,22,88,23,196,2,27,
248,22,97,23,197,1,27,249,22,177,13,2,37,23,196,2,28,23,193,2,87, 248,22,97,23,197,1,27,249,22,183,13,2,37,23,196,2,28,23,193,2,87,
94,23,194,1,249,22,63,248,22,88,23,196,2,27,248,22,97,23,197,1,27, 94,23,194,1,249,22,63,248,22,88,23,196,2,27,248,22,97,23,197,1,27,
249,22,177,13,2,37,23,196,2,28,23,193,2,87,94,23,194,1,249,22,63, 249,22,183,13,2,37,23,196,2,28,23,193,2,87,94,23,194,1,249,22,63,
248,22,88,23,196,2,248,2,36,248,22,97,23,197,1,248,22,73,194,248,22, 248,22,88,23,196,2,248,2,36,248,22,97,23,197,1,248,22,73,194,248,22,
73,194,248,22,73,194,32,39,89,162,43,36,54,2,19,222,33,40,28,248,22, 73,194,248,22,73,194,32,39,89,162,43,36,54,2,19,222,33,40,28,248,22,
71,248,22,65,23,195,2,249,22,7,9,248,22,64,195,91,159,37,11,90,161, 71,248,22,65,23,195,2,249,22,7,9,248,22,64,195,91,159,37,11,90,161,
@ -435,96 +435,96 @@
249,22,7,249,22,63,248,22,64,23,200,1,23,197,1,23,196,1,249,22,7, 249,22,7,249,22,63,248,22,64,23,200,1,23,197,1,23,196,1,249,22,7,
249,22,63,248,22,64,23,200,1,23,197,1,23,196,1,249,22,7,249,22,63, 249,22,63,248,22,64,23,200,1,23,197,1,23,196,1,249,22,7,249,22,63,
248,22,64,23,200,1,23,197,1,195,27,248,2,36,23,195,1,28,194,192,248, 248,22,64,23,200,1,23,197,1,195,27,248,2,36,23,195,1,28,194,192,248,
2,39,193,87,95,28,248,22,161,4,195,12,250,22,184,8,2,20,6,20,20, 2,39,193,87,95,28,248,22,167,4,195,12,250,22,190,8,2,20,6,20,20,
114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45,112,97,116,104,197, 114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45,112,97,116,104,197,
28,24,193,2,248,24,194,1,195,87,94,23,193,1,12,27,27,250,22,133,2, 28,24,193,2,248,24,194,1,195,87,94,23,193,1,12,27,27,250,22,137,2,
80,158,41,42,248,22,133,14,247,22,174,11,11,28,23,193,2,192,87,94,23, 80,158,41,42,248,22,139,14,247,22,180,11,11,28,23,193,2,192,87,94,23,
193,1,27,247,22,121,87,94,250,22,131,2,80,158,42,42,248,22,133,14,247, 193,1,27,247,22,121,87,94,250,22,135,2,80,158,42,42,248,22,139,14,247,
22,174,11,195,192,250,22,131,2,195,198,66,97,116,116,97,99,104,251,211,197, 22,180,11,195,192,250,22,135,2,195,198,66,97,116,116,97,99,104,251,211,197,
198,199,10,28,192,250,22,183,8,11,196,195,248,22,181,8,194,28,249,22,155, 198,199,10,28,192,250,22,189,8,11,196,195,248,22,187,8,194,28,249,22,161,
6,194,6,1,1,46,2,17,28,249,22,155,6,194,6,2,2,46,46,62,117, 6,194,6,1,1,46,2,17,28,249,22,161,6,194,6,2,2,46,46,62,117,
112,192,28,249,22,156,8,248,22,65,23,200,2,23,197,1,28,249,22,154,8, 112,192,28,249,22,162,8,248,22,65,23,200,2,23,197,1,28,249,22,160,8,
248,22,64,23,200,2,23,196,1,251,22,181,8,2,20,6,26,26,99,121,99, 248,22,64,23,200,2,23,196,1,251,22,187,8,2,20,6,26,26,99,121,99,
108,101,32,105,110,32,108,111,97,100,105,110,103,32,97,116,32,126,101,58,32, 108,101,32,105,110,32,108,111,97,100,105,110,103,32,97,116,32,126,101,58,32,
126,101,23,200,1,249,22,2,22,65,248,22,78,249,22,63,23,206,1,23,202, 126,101,23,200,1,249,22,2,22,65,248,22,78,249,22,63,23,206,1,23,202,
1,12,12,247,192,20,14,159,80,158,39,44,249,22,63,247,22,174,11,23,197, 1,12,12,247,192,20,14,159,80,158,39,44,249,22,63,247,22,180,11,23,197,
1,20,14,159,80,158,39,39,250,80,158,42,40,249,22,27,11,80,158,44,39, 1,20,14,159,80,158,39,39,250,80,158,42,40,249,22,27,11,80,158,44,39,
22,143,4,23,196,1,249,247,22,180,4,23,198,1,248,22,52,248,22,131,13, 22,149,4,23,196,1,249,247,22,186,4,23,198,1,248,22,52,248,22,137,13,
23,198,1,87,94,28,28,248,22,191,12,23,197,2,10,248,22,167,4,23,197, 23,198,1,87,94,28,28,248,22,133,13,23,197,2,10,248,22,173,4,23,197,
2,12,28,23,198,2,250,22,183,8,11,6,15,15,98,97,100,32,109,111,100, 2,12,28,23,198,2,250,22,189,8,11,6,15,15,98,97,100,32,109,111,100,
117,108,101,32,112,97,116,104,23,201,2,250,22,184,8,2,20,6,19,19,109, 117,108,101,32,112,97,116,104,23,201,2,250,22,190,8,2,20,6,19,19,109,
111,100,117,108,101,45,112,97,116,104,32,111,114,32,112,97,116,104,23,199,2, 111,100,117,108,101,45,112,97,116,104,32,111,114,32,112,97,116,104,23,199,2,
28,28,248,22,61,23,197,2,249,22,154,8,248,22,64,23,199,2,2,4,11, 28,28,248,22,61,23,197,2,249,22,160,8,248,22,64,23,199,2,2,4,11,
248,22,162,4,248,22,88,197,28,28,248,22,61,23,197,2,249,22,154,8,248, 248,22,168,4,248,22,88,197,28,28,248,22,61,23,197,2,249,22,160,8,248,
22,64,23,199,2,66,112,108,97,110,101,116,11,87,94,28,207,12,20,14,159, 22,64,23,199,2,66,112,108,97,110,101,116,11,87,94,28,207,12,20,14,159,
80,158,37,39,250,80,158,40,40,249,22,27,11,80,158,42,39,22,174,11,23, 80,158,37,39,250,80,158,40,40,249,22,27,11,80,158,42,39,22,180,11,23,
197,1,90,161,36,35,10,249,22,144,4,21,94,2,21,6,18,18,112,108,97, 197,1,90,161,36,35,10,249,22,150,4,21,94,2,21,6,18,18,112,108,97,
110,101,116,47,114,101,115,111,108,118,101,114,46,115,115,1,27,112,108,97,110, 110,101,116,47,114,101,115,111,108,118,101,114,46,115,115,1,27,112,108,97,110,
101,116,45,109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118, 101,116,45,109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,
101,114,12,251,211,199,200,201,202,87,94,23,193,1,27,89,162,8,44,36,45, 101,114,12,251,211,199,200,201,202,87,94,23,193,1,27,89,162,8,44,36,45,
79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114,223, 79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114,223,
6,33,44,27,28,248,22,51,23,199,2,27,250,22,133,2,80,158,43,43,249, 6,33,44,27,28,248,22,51,23,199,2,27,250,22,137,2,80,158,43,43,249,
22,63,23,204,2,247,22,168,13,11,28,23,193,2,192,87,94,23,193,1,91, 22,63,23,204,2,247,22,174,13,11,28,23,193,2,192,87,94,23,193,1,91,
159,37,11,90,161,37,35,11,249,80,159,44,48,36,248,22,54,23,204,2,11, 159,37,11,90,161,37,35,11,249,80,159,44,48,36,248,22,54,23,204,2,11,
27,251,80,158,47,50,2,20,23,202,1,28,248,22,71,23,199,2,23,199,2, 27,251,80,158,47,50,2,20,23,202,1,28,248,22,71,23,199,2,23,199,2,
248,22,64,23,199,2,28,248,22,71,23,199,2,9,248,22,65,23,199,2,249, 248,22,64,23,199,2,28,248,22,71,23,199,2,9,248,22,65,23,199,2,249,
22,145,13,23,195,1,28,248,22,71,23,197,1,87,94,23,197,1,6,7,7, 22,151,13,23,195,1,28,248,22,71,23,197,1,87,94,23,197,1,6,7,7,
109,97,105,110,46,115,115,249,22,172,6,23,199,1,6,3,3,46,115,115,28, 109,97,105,110,46,115,115,249,22,178,6,23,199,1,6,3,3,46,115,115,28,
248,22,149,6,23,199,2,87,94,23,194,1,27,248,80,159,41,55,36,23,201, 248,22,155,6,23,199,2,87,94,23,194,1,27,248,80,159,41,55,36,23,201,
2,27,250,22,133,2,80,158,44,43,249,22,63,23,205,2,23,199,2,11,28, 2,27,250,22,137,2,80,158,44,43,249,22,63,23,205,2,23,199,2,11,28,
23,193,2,192,87,94,23,193,1,91,159,37,11,90,161,37,35,11,249,80,159, 23,193,2,192,87,94,23,193,1,91,159,37,11,90,161,37,35,11,249,80,159,
45,48,36,23,204,2,11,250,22,1,22,145,13,23,199,1,249,22,77,249,22, 45,48,36,23,204,2,11,250,22,1,22,151,13,23,199,1,249,22,77,249,22,
2,32,0,89,162,8,44,36,43,9,222,33,45,23,200,1,248,22,73,23,200, 2,32,0,89,162,8,44,36,43,9,222,33,45,23,200,1,248,22,73,23,200,
1,28,248,22,191,12,23,199,2,87,94,23,194,1,28,248,22,150,13,23,199, 1,28,248,22,133,13,23,199,2,87,94,23,194,1,28,248,22,156,13,23,199,
2,23,198,2,248,22,73,6,26,26,32,40,97,32,112,97,116,104,32,109,117, 2,23,198,2,248,22,73,6,26,26,32,40,97,32,112,97,116,104,32,109,117,
115,116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22,154,8,248, 115,116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22,160,8,248,
22,64,23,201,2,2,21,27,250,22,133,2,80,158,43,43,249,22,63,23,204, 22,64,23,201,2,2,21,27,250,22,137,2,80,158,43,43,249,22,63,23,204,
2,247,22,168,13,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90, 2,247,22,174,13,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90,
161,37,35,11,249,80,159,45,48,36,248,22,88,23,205,2,11,90,161,36,37, 161,37,35,11,249,80,159,45,48,36,248,22,88,23,205,2,11,90,161,36,37,
11,28,248,22,71,248,22,90,23,204,2,28,248,22,71,23,194,2,249,22,179, 11,28,248,22,71,248,22,90,23,204,2,28,248,22,71,23,194,2,249,22,185,
13,0,8,35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197, 13,0,8,35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197,
2,249,22,77,28,248,22,71,248,22,90,23,208,2,21,93,6,5,5,109,122, 2,249,22,77,28,248,22,71,248,22,90,23,208,2,21,93,6,5,5,109,122,
108,105,98,249,22,1,22,77,249,22,2,80,159,51,56,36,248,22,90,23,211, 108,105,98,249,22,1,22,77,249,22,2,80,159,51,56,36,248,22,90,23,211,
2,23,197,2,28,248,22,71,23,196,2,248,22,73,23,197,2,23,195,2,251, 2,23,197,2,28,248,22,71,23,196,2,248,22,73,23,197,2,23,195,2,251,
80,158,49,50,2,20,23,204,1,248,22,64,23,198,2,248,22,65,23,198,1, 80,158,49,50,2,20,23,204,1,248,22,64,23,198,2,248,22,65,23,198,1,
249,22,145,13,23,195,1,28,23,198,1,87,94,23,196,1,23,197,1,28,248, 249,22,151,13,23,195,1,28,23,198,1,87,94,23,196,1,23,197,1,28,248,
22,71,23,197,1,87,94,23,197,1,6,7,7,109,97,105,110,46,115,115,28, 22,71,23,197,1,87,94,23,197,1,6,7,7,109,97,105,110,46,115,115,28,
249,22,179,13,0,8,35,114,120,34,91,46,93,34,23,199,2,23,197,1,249, 249,22,185,13,0,8,35,114,120,34,91,46,93,34,23,199,2,23,197,1,249,
22,172,6,23,199,1,6,3,3,46,115,115,28,249,22,154,8,248,22,64,23, 22,178,6,23,199,1,6,3,3,46,115,115,28,249,22,160,8,248,22,64,23,
201,2,64,102,105,108,101,249,22,152,13,248,22,156,13,248,22,88,23,202,2, 201,2,64,102,105,108,101,249,22,158,13,248,22,162,13,248,22,88,23,202,2,
248,80,159,42,55,36,23,202,2,12,87,94,28,28,248,22,191,12,23,194,2, 248,80,159,42,55,36,23,202,2,12,87,94,28,28,248,22,133,13,23,194,2,
10,248,22,171,7,23,194,2,87,94,23,200,1,12,28,23,200,2,250,22,183, 10,248,22,177,7,23,194,2,87,94,23,200,1,12,28,23,200,2,250,22,189,
8,67,114,101,113,117,105,114,101,249,22,133,7,6,17,17,98,97,100,32,109, 8,67,114,101,113,117,105,114,101,249,22,139,7,6,17,17,98,97,100,32,109,
111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2,248,22,64,23,199, 111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2,248,22,64,23,199,
2,6,0,0,23,203,1,87,94,23,200,1,250,22,184,8,2,20,249,22,133, 2,6,0,0,23,203,1,87,94,23,200,1,250,22,190,8,2,20,249,22,139,
7,6,13,13,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2, 7,6,13,13,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2,
248,22,64,23,199,2,6,0,0,23,201,2,27,28,248,22,171,7,23,195,2, 248,22,64,23,199,2,6,0,0,23,201,2,27,28,248,22,177,7,23,195,2,
249,22,176,7,23,196,2,35,249,22,154,13,248,22,155,13,23,197,2,11,27, 249,22,182,7,23,196,2,35,249,22,160,13,248,22,161,13,23,197,2,11,27,
28,248,22,171,7,23,196,2,249,22,176,7,23,197,2,36,248,80,158,42,51, 28,248,22,177,7,23,196,2,249,22,182,7,23,197,2,36,248,80,158,42,51,
23,195,2,91,159,38,11,90,161,38,35,11,28,248,22,171,7,23,199,2,250, 23,195,2,91,159,38,11,90,161,38,35,11,28,248,22,177,7,23,199,2,250,
22,7,2,22,249,22,176,7,23,203,2,37,2,22,248,22,148,13,23,198,2, 22,7,2,22,249,22,182,7,23,203,2,37,2,22,248,22,154,13,23,198,2,
87,95,23,195,1,23,193,1,27,28,248,22,171,7,23,200,2,249,22,176,7, 87,95,23,195,1,23,193,1,27,28,248,22,177,7,23,200,2,249,22,182,7,
23,201,2,38,249,80,158,47,52,23,197,2,5,0,27,28,248,22,171,7,23, 23,201,2,38,249,80,158,47,52,23,197,2,5,0,27,28,248,22,177,7,23,
201,2,249,22,176,7,23,202,2,39,248,22,162,4,23,200,2,27,27,250,22, 201,2,249,22,182,7,23,202,2,39,248,22,168,4,23,200,2,27,27,250,22,
133,2,80,158,51,42,248,22,133,14,247,22,174,11,11,28,23,193,2,192,87, 137,2,80,158,51,42,248,22,139,14,247,22,180,11,11,28,23,193,2,192,87,
94,23,193,1,27,247,22,121,87,94,250,22,131,2,80,158,52,42,248,22,133, 94,23,193,1,27,247,22,121,87,94,250,22,135,2,80,158,52,42,248,22,139,
14,247,22,174,11,195,192,87,95,28,23,209,1,27,250,22,133,2,23,197,2, 14,247,22,180,11,195,192,87,95,28,23,209,1,27,250,22,137,2,23,197,2,
197,11,28,23,193,1,12,87,95,27,27,28,248,22,17,80,158,51,45,80,158, 197,11,28,23,193,1,12,87,95,27,27,28,248,22,17,80,158,51,45,80,158,
50,45,247,22,19,250,22,25,248,22,23,23,197,2,80,158,53,44,23,196,1, 50,45,247,22,19,250,22,25,248,22,23,23,197,2,80,158,53,44,23,196,1,
27,247,22,174,11,249,22,3,83,158,39,20,97,94,89,162,8,44,36,54,9, 27,247,22,180,11,249,22,3,83,158,39,20,97,94,89,162,8,44,36,54,9,
226,12,11,2,3,33,46,23,195,1,23,196,1,248,28,248,22,17,80,158,50, 226,12,11,2,3,33,46,23,195,1,23,196,1,248,28,248,22,17,80,158,50,
45,32,0,89,162,43,36,41,9,222,33,47,80,159,49,57,36,89,162,43,35, 45,32,0,89,162,43,36,41,9,222,33,47,80,159,49,57,36,89,162,43,35,
50,9,227,14,9,8,4,3,33,48,250,22,131,2,23,197,1,197,10,12,28, 50,9,227,14,9,8,4,3,33,48,250,22,135,2,23,197,1,197,10,12,28,
28,248,22,171,7,23,202,1,11,27,248,22,149,6,23,208,2,28,192,192,28, 28,248,22,177,7,23,202,1,11,27,248,22,155,6,23,208,2,28,192,192,28,
248,22,61,23,208,2,249,22,154,8,248,22,64,23,210,2,2,21,11,250,22, 248,22,61,23,208,2,249,22,160,8,248,22,64,23,210,2,2,21,11,250,22,
131,2,80,158,50,43,28,248,22,149,6,23,210,2,249,22,63,23,211,1,248, 135,2,80,158,50,43,28,248,22,155,6,23,210,2,249,22,63,23,211,1,248,
80,159,53,55,36,23,213,1,87,94,23,210,1,249,22,63,23,211,1,247,22, 80,159,53,55,36,23,213,1,87,94,23,210,1,249,22,63,23,211,1,247,22,
168,13,252,22,173,7,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193, 174,13,252,22,179,7,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193,
91,159,37,10,90,161,36,35,10,11,90,161,36,36,10,83,158,38,20,96,96, 91,159,37,10,90,161,36,35,10,11,90,161,36,36,10,83,158,38,20,96,96,
2,20,89,162,8,44,36,50,9,224,2,0,33,42,89,162,43,38,48,9,223, 2,20,89,162,8,44,36,50,9,224,2,0,33,42,89,162,43,38,48,9,223,
1,33,43,89,162,43,39,8,30,9,225,2,3,0,33,49,208,87,95,248,22, 1,33,43,89,162,43,39,8,30,9,225,2,3,0,33,49,208,87,95,248,22,
142,4,248,80,158,37,49,247,22,174,11,248,22,180,4,80,158,36,36,248,22, 148,4,248,80,158,37,49,247,22,180,11,248,22,186,4,80,158,36,36,248,22,
165,12,80,159,36,41,36,159,35,20,103,159,35,16,1,65,98,101,103,105,110, 171,12,80,159,36,41,36,159,35,20,103,159,35,16,1,65,98,101,103,105,110,
16,0,83,158,41,20,100,138,66,35,37,98,111,111,116,2,1,11,11,10,10, 16,0,83,158,41,20,100,138,66,35,37,98,111,111,116,2,1,11,11,10,10,
36,80,158,35,35,20,103,159,39,16,19,30,2,1,2,2,193,30,2,1,2, 36,80,158,35,35,20,103,159,39,16,19,30,2,1,2,2,193,30,2,1,2,
3,193,30,2,5,72,112,97,116,104,45,115,116,114,105,110,103,63,10,30,2, 3,193,30,2,5,72,112,97,116,104,45,115,116,114,105,110,103,63,10,30,2,
@ -545,11 +545,11 @@
44,9,223,0,33,24,80,159,35,56,36,83,158,35,16,2,89,162,43,36,48, 44,9,223,0,33,24,80,159,35,56,36,83,158,35,16,2,89,162,43,36,48,
67,103,101,116,45,100,105,114,223,0,33,25,80,159,35,55,36,83,158,35,16, 67,103,101,116,45,100,105,114,223,0,33,25,80,159,35,55,36,83,158,35,16,
2,89,162,43,37,48,68,119,105,116,104,45,100,105,114,223,0,33,26,80,159, 2,89,162,43,37,48,68,119,105,116,104,45,100,105,114,223,0,33,26,80,159,
35,54,36,83,158,35,16,2,248,22,168,7,69,115,111,45,115,117,102,102,105, 35,54,36,83,158,35,16,2,248,22,174,7,69,115,111,45,115,117,102,102,105,
120,80,159,35,35,36,83,158,35,16,2,89,162,43,37,59,2,3,223,0,33, 120,80,159,35,35,36,83,158,35,16,2,89,162,43,37,59,2,3,223,0,33,
35,80,159,35,36,36,83,158,35,16,2,32,0,89,162,8,44,36,41,2,7, 35,80,159,35,36,36,83,158,35,16,2,32,0,89,162,8,44,36,41,2,7,
222,192,80,159,35,41,36,83,158,35,16,2,247,22,123,80,159,35,42,36,83, 222,192,80,159,35,41,36,83,158,35,16,2,247,22,124,80,159,35,42,36,83,
158,35,16,2,247,22,122,80,159,35,43,36,83,158,35,16,2,247,22,59,80, 158,35,16,2,247,22,123,80,159,35,43,36,83,158,35,16,2,247,22,59,80,
159,35,44,36,83,158,35,16,2,248,22,18,74,109,111,100,117,108,101,45,108, 159,35,44,36,83,158,35,16,2,248,22,18,74,109,111,100,117,108,101,45,108,
111,97,100,105,110,103,80,159,35,45,36,83,158,35,16,2,11,80,158,35,46, 111,97,100,105,110,103,80,159,35,45,36,83,158,35,16,2,11,80,158,35,46,
83,158,35,16,2,11,80,158,35,47,83,158,35,16,2,32,0,89,162,43,37, 83,158,35,16,2,11,80,158,35,47,83,158,35,16,2,32,0,89,162,43,37,

View File

@ -1304,6 +1304,22 @@ long scheme_equal_hash_key2(Scheme_Object *o)
return equal_hash_key2(o, &hi); return equal_hash_key2(o, &hi);
} }
long scheme_eqv_hash_key(Scheme_Object *o)
{
if (!SCHEME_INTP(o) && SCHEME_NUMBERP(o))
return scheme_equal_hash_key(o);
else
return (PTR_TO_LONG(o) >> 2);
}
long scheme_eqv_hash_key2(Scheme_Object *o)
{
if (!SCHEME_INTP(o) && SCHEME_NUMBERP(o))
return scheme_equal_hash_key2(o);
else
return (PTR_TO_LONG(o) >> 3);
}
static Scheme_Object *hash2_recur(int argc, Scheme_Object **argv, Scheme_Object *prim) static Scheme_Object *hash2_recur(int argc, Scheme_Object **argv, Scheme_Object *prim)
{ {
long v; long v;
@ -2116,7 +2132,7 @@ static RBNode *rb_remove(RBNode *s, unsigned long code)
return remove_aux(s, code, &bh_dec); return remove_aux(s, code, &bh_dec);
} }
Scheme_Hash_Tree *scheme_make_hash_tree(int eql) Scheme_Hash_Tree *scheme_make_hash_tree(int kind)
{ {
Scheme_Hash_Tree *tree; Scheme_Hash_Tree *tree;
@ -2125,8 +2141,7 @@ Scheme_Hash_Tree *scheme_make_hash_tree(int eql)
tree->count = 0; tree->count = 0;
tree->iso.so.type = scheme_hash_tree_type; tree->iso.so.type = scheme_hash_tree_type;
if (eql) SCHEME_HASHTR_FLAGS(tree) |= (kind & 0x3);
SCHEME_HASHTR_FLAGS(tree) |= 0x1;
return tree; return tree;
} }
@ -2138,8 +2153,12 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke
RBNode *root, *added; RBNode *root, *added;
int delta; int delta;
if (SCHEME_HASHTR_FLAGS(tree) & 0x1) { if (SCHEME_HASHTR_FLAGS(tree) & 0x3) {
h = (unsigned long)scheme_equal_hash_key(key); if (SCHEME_HASHTR_FLAGS(tree) & 0x1) {
h = (unsigned long)scheme_equal_hash_key(key);
} else {
h = (unsigned long)scheme_eqv_hash_key(key);
}
} else { } else {
h = (unsigned long)PTR_TO_LONG((Scheme_Object *)key); h = (unsigned long)PTR_TO_LONG((Scheme_Object *)key);
} }
@ -2150,10 +2169,12 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke
if (!added) if (!added)
return tree; /* nothing to remove */ return tree; /* nothing to remove */
if (added->key) { if (added->key) {
int eql = (SCHEME_HASHTR_FLAGS(tree) & 0x1); int kind = (SCHEME_HASHTR_FLAGS(tree) & 0x3);
if ((eql && scheme_equal(added->key, key)) if ((kind && ((kind == 1)
|| (!eql && SAME_OBJ(added->key, key))) { ? scheme_equal(added->key, key)
: scheme_eqv(added->key, key)))
|| (!kind && SAME_OBJ(added->key, key))) {
/* remove single item */ /* remove single item */
root = rb_remove(tree->root, h); root = rb_remove(tree->root, h);
@ -2182,7 +2203,7 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke
delta = 0; delta = 0;
if (added->val) { if (added->val) {
int eql = (SCHEME_HASHTR_FLAGS(tree) & 0x1); int kind = (SCHEME_HASHTR_FLAGS(tree) & 0x3);
if (!added->key) { if (!added->key) {
/* Have a list of keys and vals. In this case, val can be NULL /* Have a list of keys and vals. In this case, val can be NULL
@ -2191,9 +2212,14 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke
int cnt = 0; int cnt = 0;
while (prs) { while (prs) {
a = SCHEME_CAR(prs); a = SCHEME_CAR(prs);
if (eql) { if (kind) {
if (scheme_equal(SCHEME_CAR(a), key)) if (kind == 1) {
break; if (scheme_equal(SCHEME_CAR(a), key))
break;
} else {
if (scheme_eqv(SCHEME_CAR(a), key))
break;
}
} else { } else {
if (SAME_OBJ(SCHEME_CAR(a), key)) if (SAME_OBJ(SCHEME_CAR(a), key))
break; break;
@ -2231,8 +2257,11 @@ Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *ke
} else { } else {
/* Currently have one value for this hash code */ /* Currently have one value for this hash code */
int same; int same;
if (eql) { if (kind) {
same = scheme_equal(key, added->key); if (kind == 1)
same = scheme_equal(key, added->key);
else
same = scheme_eqv(key, added->key);
} else { } else {
same = SAME_OBJ(key, added->key); same = SAME_OBJ(key, added->key);
} }
@ -2271,25 +2300,32 @@ Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key)
{ {
unsigned long h; unsigned long h;
RBNode *rb; RBNode *rb;
int kind = (SCHEME_HASHTR_FLAGS(tree) & 0x3);
if (SCHEME_HASHTR_FLAGS(tree) & 0x1) { if (kind) {
h = (unsigned long)scheme_equal_hash_key(key); if (kind == 1)
h = (unsigned long)scheme_equal_hash_key(key);
else
h = (unsigned long)scheme_eqv_hash_key(key);
} else { } else {
h = (unsigned long)PTR_TO_LONG((Scheme_Object *)key); h = (unsigned long)PTR_TO_LONG((Scheme_Object *)key);
} }
rb = rb_find(h, tree->root); rb = rb_find(h, tree->root);
if (rb) { if (rb) {
int eql = (SCHEME_HASHTR_FLAGS(tree) & 0x1);
if (!rb->key) { if (!rb->key) {
/* Have list of keys & vals: */ /* Have list of keys & vals: */
Scheme_Object *prs = rb->val, *a; Scheme_Object *prs = rb->val, *a;
while (prs) { while (prs) {
a = SCHEME_CAR(prs); a = SCHEME_CAR(prs);
if (eql) { if (kind) {
if (scheme_equal(SCHEME_CAR(a), key)) if (kind == 1) {
return SCHEME_CDR(a); if (scheme_equal(SCHEME_CAR(a), key))
return SCHEME_CDR(a);
} else {
if (scheme_eqv(SCHEME_CAR(a), key))
return SCHEME_CDR(a);
}
} else { } else {
if (SAME_OBJ(SCHEME_CAR(a), key)) if (SAME_OBJ(SCHEME_CAR(a), key))
return SCHEME_CDR(a); return SCHEME_CDR(a);
@ -2297,9 +2333,14 @@ Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key)
prs = SCHEME_CDR(prs); prs = SCHEME_CDR(prs);
} }
} else { } else {
if (eql) { if (kind) {
if (scheme_equal(key, rb->key)) if (kind == 1) {
return rb->val; if (scheme_equal(key, rb->key))
return rb->val;
} else {
if (scheme_eqv(key, rb->key))
return rb->val;
}
} else if (SAME_OBJ(key, rb->key)) } else if (SAME_OBJ(key, rb->key))
return rb->val; return rb->val;
} }
@ -2381,7 +2422,7 @@ int scheme_hash_tree_equal_rec(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2, void
int i; int i;
if ((t1->count != t2->count) if ((t1->count != t2->count)
|| ((SCHEME_HASHTR_FLAGS(t1) & 0x1) != (SCHEME_HASHTR_FLAGS(t2) & 0x1))) || ((SCHEME_HASHTR_FLAGS(t1) & 0x3) != (SCHEME_HASHTR_FLAGS(t2) & 0x3)))
return 0; return 0;
for (i = t1->count; i--; ) { for (i = t1->count; i--; ) {

View File

@ -83,14 +83,18 @@ static Scheme_Object *set_box (int argc, Scheme_Object *argv[]);
static Scheme_Object *make_hash(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hash(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_hasheq(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hasheq(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_hasheqv(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_weak_hash(int argc, Scheme_Object *argv[]); static Scheme_Object *make_weak_hash(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_weak_hasheq(int argc, Scheme_Object *argv[]); static Scheme_Object *make_weak_hasheq(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_weak_hasheqv(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_immutable_hash(int argc, Scheme_Object *argv[]); static Scheme_Object *make_immutable_hash(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_immutable_hasheq(int argc, Scheme_Object *argv[]); static Scheme_Object *make_immutable_hasheq(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_immutable_hasheqv(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_table_count(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_count(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_table_copy(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_copy(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_p(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_p(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_eq_p(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_eq_p(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_eqv_p(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_weak_p(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_weak_p(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_table_put_bang(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_put_bang(int argc, Scheme_Object *argv[]);
static Scheme_Object *hash_table_put(int argc, Scheme_Object *argv[]); static Scheme_Object *hash_table_put(int argc, Scheme_Object *argv[]);
@ -106,6 +110,7 @@ static Scheme_Object *hash_table_iterate_key(int argc, Scheme_Object *argv[]);
static Scheme_Object *eq_hash_code(int argc, Scheme_Object *argv[]); static Scheme_Object *eq_hash_code(int argc, Scheme_Object *argv[]);
static Scheme_Object *equal_hash_code(int argc, Scheme_Object *argv[]); static Scheme_Object *equal_hash_code(int argc, Scheme_Object *argv[]);
static Scheme_Object *equal_hash2_code(int argc, Scheme_Object *argv[]); static Scheme_Object *equal_hash2_code(int argc, Scheme_Object *argv[]);
static Scheme_Object *eqv_hash_code(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_weak_box(int argc, Scheme_Object *argv[]); static Scheme_Object *make_weak_box(int argc, Scheme_Object *argv[]);
static Scheme_Object *weak_box_value(int argc, Scheme_Object *argv[]); static Scheme_Object *weak_box_value(int argc, Scheme_Object *argv[]);
@ -122,6 +127,7 @@ static Scheme_Object *placeholder_get(int argc, Scheme_Object *argv[]);
static Scheme_Object *placeholder_p(int argc, Scheme_Object *argv[]); static Scheme_Object *placeholder_p(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_hash_placeholder(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hash_placeholder(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[]);
static Scheme_Object *make_hasheqv_placeholder(int argc, Scheme_Object *argv[]);
static Scheme_Object *table_placeholder_p(int argc, Scheme_Object *argv[]); static Scheme_Object *table_placeholder_p(int argc, Scheme_Object *argv[]);
#define BOX "box" #define BOX "box"
@ -433,6 +439,11 @@ scheme_init_list (Scheme_Env *env)
"make-hasheq", "make-hasheq",
0, 0), 0, 0),
env); env);
scheme_add_global_constant("make-hasheqv",
scheme_make_immed_prim(make_hasheqv,
"make-hasheqv",
0, 0),
env);
scheme_add_global_constant("make-weak-hash", scheme_add_global_constant("make-weak-hash",
scheme_make_immed_prim(make_weak_hash, scheme_make_immed_prim(make_weak_hash,
"make-weak-hash", "make-weak-hash",
@ -443,6 +454,11 @@ scheme_init_list (Scheme_Env *env)
"make-weak-hasheq", "make-weak-hasheq",
0, 0), 0, 0),
env); env);
scheme_add_global_constant("make-weak-hasheqv",
scheme_make_immed_prim(make_weak_hasheqv,
"make-weak-hasheqv",
0, 0),
env);
scheme_add_global_constant("make-immutable-hash", scheme_add_global_constant("make-immutable-hash",
scheme_make_immed_prim(make_immutable_hash, scheme_make_immed_prim(make_immutable_hash,
"make-immutable-hash", "make-immutable-hash",
@ -453,6 +469,11 @@ scheme_init_list (Scheme_Env *env)
"make-immutable-hasheq", "make-immutable-hasheq",
1, 1), 1, 1),
env); env);
scheme_add_global_constant("make-immutable-hasheqv",
scheme_make_immed_prim(make_immutable_hasheqv,
"make-immutable-hasheqv",
1, 1),
env);
scheme_add_global_constant("hash?", scheme_add_global_constant("hash?",
scheme_make_folding_prim(hash_p, scheme_make_folding_prim(hash_p,
"hash?", "hash?",
@ -463,6 +484,11 @@ scheme_init_list (Scheme_Env *env)
"hash-eq?", "hash-eq?",
1, 1, 1), 1, 1, 1),
env); env);
scheme_add_global_constant("hash-eqv?",
scheme_make_folding_prim(hash_eqv_p,
"hash-eqv?",
1, 1, 1),
env);
scheme_add_global_constant("hash-weak?", scheme_add_global_constant("hash-weak?",
scheme_make_folding_prim(hash_weak_p, scheme_make_folding_prim(hash_weak_p,
"hash-weak?", "hash-weak?",
@ -540,6 +566,11 @@ scheme_init_list (Scheme_Env *env)
"eq-hash-code", "eq-hash-code",
1, 1), 1, 1),
env); env);
scheme_add_global_constant("eqv-hash-code",
scheme_make_immed_prim(eqv_hash_code,
"eqv-hash-code",
1, 1),
env);
scheme_add_global_constant("equal-hash-code", scheme_add_global_constant("equal-hash-code",
scheme_make_noncm_prim(equal_hash_code, scheme_make_noncm_prim(equal_hash_code,
"equal-hash-code", "equal-hash-code",
@ -618,6 +649,11 @@ scheme_init_list (Scheme_Env *env)
"make-hasheq-placeholder", "make-hasheq-placeholder",
1, 1), 1, 1),
env); env);
scheme_add_global_constant("make-hasheqv-placeholder",
scheme_make_prim_w_arity(make_hasheqv_placeholder,
"make-hasheqv-placeholder",
1, 1),
env);
scheme_add_global_constant("hash-placeholder?", scheme_add_global_constant("hash-placeholder?",
scheme_make_folding_prim(table_placeholder_p, scheme_make_folding_prim(table_placeholder_p,
"hash-placeholder?", "hash-placeholder?",
@ -1417,6 +1453,19 @@ static void make_hash_indices_for_equal(void *v, long *_stk_h1, long *_stk_h2)
*_stk_h2 = scheme_equal_hash_key2((Scheme_Object *)v); *_stk_h2 = scheme_equal_hash_key2((Scheme_Object *)v);
} }
static int compare_eqv(void *v1, void *v2)
{
return !scheme_eqv((Scheme_Object *)v1, (Scheme_Object *)v2);
}
static void make_hash_indices_for_eqv(void *v, long *_stk_h1, long *_stk_h2)
{
if (_stk_h1)
*_stk_h1 = scheme_eqv_hash_key((Scheme_Object *)v);
if (_stk_h2)
*_stk_h2 = scheme_eqv_hash_key2((Scheme_Object *)v);
}
Scheme_Bucket_Table *scheme_make_weak_equal_table(void) Scheme_Bucket_Table *scheme_make_weak_equal_table(void)
{ {
Scheme_Object *sema; Scheme_Object *sema;
@ -1432,6 +1481,21 @@ Scheme_Bucket_Table *scheme_make_weak_equal_table(void)
return t; return t;
} }
Scheme_Bucket_Table *scheme_make_weak_eqv_table(void)
{
Scheme_Object *sema;
Scheme_Bucket_Table *t;
t = scheme_make_bucket_table(20, SCHEME_hash_weak_ptr);
sema = scheme_make_sema(1);
t->mutex = sema;
t->compare = compare_eqv;
t->make_hash_indices = make_hash_indices_for_eqv;
return t;
}
static Scheme_Object *make_hash(int argc, Scheme_Object *argv[]) static Scheme_Object *make_hash(int argc, Scheme_Object *argv[])
{ {
return (Scheme_Object *)scheme_make_hash_table_equal(); return (Scheme_Object *)scheme_make_hash_table_equal();
@ -1442,6 +1506,11 @@ static Scheme_Object *make_hasheq(int argc, Scheme_Object *argv[])
return (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr); return (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr);
} }
static Scheme_Object *make_hasheqv(int argc, Scheme_Object *argv[])
{
return (Scheme_Object *)scheme_make_hash_table_eqv();
}
static Scheme_Object *make_weak_hash(int argc, Scheme_Object *argv[]) static Scheme_Object *make_weak_hash(int argc, Scheme_Object *argv[])
{ {
return (Scheme_Object *)scheme_make_weak_equal_table(); return (Scheme_Object *)scheme_make_weak_equal_table();
@ -1452,7 +1521,12 @@ static Scheme_Object *make_weak_hasheq(int argc, Scheme_Object *argv[])
return (Scheme_Object *)scheme_make_bucket_table(20, SCHEME_hash_weak_ptr); return (Scheme_Object *)scheme_make_bucket_table(20, SCHEME_hash_weak_ptr);
} }
static Scheme_Object *make_immutable_table(const char *who, int eql, int argc, Scheme_Object *argv[]) static Scheme_Object *make_weak_hasheqv(int argc, Scheme_Object *argv[])
{
return (Scheme_Object *)scheme_make_weak_eqv_table();
}
static Scheme_Object *make_immutable_table(const char *who, int kind, int argc, Scheme_Object *argv[])
{ {
Scheme_Object *l = argv[0], *a; Scheme_Object *l = argv[0], *a;
Scheme_Hash_Tree *ht; Scheme_Hash_Tree *ht;
@ -1468,7 +1542,7 @@ static Scheme_Object *make_immutable_table(const char *who, int eql, int argc, S
if (!SCHEME_NULLP(l)) if (!SCHEME_NULLP(l))
scheme_wrong_type("make-immutable-hash", "list of pairs", 0, argc, argv); scheme_wrong_type("make-immutable-hash", "list of pairs", 0, argc, argv);
ht = scheme_make_hash_tree(eql); ht = scheme_make_hash_tree(kind);
for (l = argv[0]; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) { for (l = argv[0]; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) {
a = SCHEME_CAR(l); a = SCHEME_CAR(l);
@ -1488,6 +1562,11 @@ static Scheme_Object *make_immutable_hasheq(int argc, Scheme_Object *argv[])
return make_immutable_table("make-immutable-hasheq", 0, argc, argv); return make_immutable_table("make-immutable-hasheq", 0, argc, argv);
} }
static Scheme_Object *make_immutable_hasheqv(int argc, Scheme_Object *argv[])
{
return make_immutable_table("make-immutable-hasheqv", 2, argc, argv);
}
Scheme_Hash_Table *scheme_make_hash_table_equal() Scheme_Hash_Table *scheme_make_hash_table_equal()
{ {
Scheme_Hash_Table *t; Scheme_Hash_Table *t;
@ -1503,6 +1582,21 @@ Scheme_Hash_Table *scheme_make_hash_table_equal()
return t; return t;
} }
Scheme_Hash_Table *scheme_make_hash_table_eqv()
{
Scheme_Hash_Table *t;
Scheme_Object *sema;
t = scheme_make_hash_table(SCHEME_hash_ptr);
sema = scheme_make_sema(1);
t->mutex = sema;
t->compare = compare_eqv;
t->make_hash_indices = make_hash_indices_for_eqv;
return t;
}
static Scheme_Object *hash_table_count(int argc, Scheme_Object *argv[]) static Scheme_Object *hash_table_count(int argc, Scheme_Object *argv[])
{ {
if (SCHEME_HASHTP(argv[0])) { if (SCHEME_HASHTP(argv[0])) {
@ -1595,13 +1689,15 @@ static Scheme_Object *hash_eq_p(int argc, Scheme_Object *argv[])
Scheme_Object *o = argv[0]; Scheme_Object *o = argv[0];
if (SCHEME_HASHTP(o)) { if (SCHEME_HASHTP(o)) {
if (((Scheme_Hash_Table *)o)->compare != compare_equal) if ((((Scheme_Hash_Table *)o)->compare != compare_equal)
&& (((Scheme_Hash_Table *)o)->compare != compare_eqv))
return scheme_true; return scheme_true;
} else if (SCHEME_HASHTRP(o)) { } else if (SCHEME_HASHTRP(o)) {
if (!(SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x1)) if (!(SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x3))
return scheme_true; return scheme_true;
} else if (SCHEME_BUCKTP(o)) { } else if (SCHEME_BUCKTP(o)) {
if (((Scheme_Bucket_Table *)o)->compare != compare_equal) if ((((Scheme_Bucket_Table *)o)->compare != compare_equal)
&& (((Scheme_Bucket_Table *)o)->compare != compare_eqv))
return scheme_true; return scheme_true;
} else { } else {
scheme_wrong_type("hash-eq?", "hash", 0, argc, argv); scheme_wrong_type("hash-eq?", "hash", 0, argc, argv);
@ -1610,6 +1706,26 @@ static Scheme_Object *hash_eq_p(int argc, Scheme_Object *argv[])
return scheme_false; return scheme_false;
} }
static Scheme_Object *hash_eqv_p(int argc, Scheme_Object *argv[])
{
Scheme_Object *o = argv[0];
if (SCHEME_HASHTP(o)) {
if (((Scheme_Hash_Table *)o)->compare == compare_eqv)
return scheme_true;
} else if (SCHEME_HASHTRP(o)) {
if (SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x2)
return scheme_true;
} else if (SCHEME_BUCKTP(o)) {
if (((Scheme_Bucket_Table *)o)->compare == compare_eqv)
return scheme_true;
} else {
scheme_wrong_type("hash-eqv?", "hash", 0, argc, argv);
}
return scheme_false;
}
static Scheme_Object *hash_weak_p(int argc, Scheme_Object *argv[]) static Scheme_Object *hash_weak_p(int argc, Scheme_Object *argv[])
{ {
Scheme_Object *o = argv[0]; Scheme_Object *o = argv[0];
@ -1629,11 +1745,21 @@ int scheme_is_hash_table_equal(Scheme_Object *o)
return (((Scheme_Hash_Table *)o)->compare == compare_equal); return (((Scheme_Hash_Table *)o)->compare == compare_equal);
} }
int scheme_is_hash_table_eqv(Scheme_Object *o)
{
return (((Scheme_Hash_Table *)o)->compare == compare_eqv);
}
int scheme_is_hash_tree_equal(Scheme_Object *o) int scheme_is_hash_tree_equal(Scheme_Object *o)
{ {
return SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x1; return SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x1;
} }
int scheme_is_hash_tree_eqv(Scheme_Object *o)
{
return SCHEME_HASHTR_FLAGS((Scheme_Hash_Tree *)o) & 0x2;
}
static Scheme_Object *hash_table_put_bang(int argc, Scheme_Object *argv[]) static Scheme_Object *hash_table_put_bang(int argc, Scheme_Object *argv[])
{ {
Scheme_Object *v = argv[0]; Scheme_Object *v = argv[0];
@ -2060,6 +2186,18 @@ static Scheme_Object *equal_hash2_code(int argc, Scheme_Object *argv[])
return scheme_make_integer(v); return scheme_make_integer(v);
} }
static Scheme_Object *eqv_hash_code(int argc, Scheme_Object *argv[])
{
long v;
if (SCHEME_INTP(argv[0]))
return argv[0];
v = scheme_eqv_hash_key(argv[0]);
return scheme_make_integer(v);
}
Scheme_Object *scheme_make_weak_box(Scheme_Object *v) Scheme_Object *scheme_make_weak_box(Scheme_Object *v)
{ {
#ifdef MZ_PRECISE_GC #ifdef MZ_PRECISE_GC
@ -2145,7 +2283,7 @@ static Scheme_Object *placeholder_p(int c, Scheme_Object *p[])
: scheme_false); : scheme_false);
} }
static Scheme_Object *do_make_hash_placeholder(const char *who, int eq, int argc, Scheme_Object *argv[]) static Scheme_Object *do_make_hash_placeholder(const char *who, int kind, int argc, Scheme_Object *argv[])
{ {
Scheme_Object *l, *a, *ph; Scheme_Object *l, *a, *ph;
@ -2162,14 +2300,14 @@ static Scheme_Object *do_make_hash_placeholder(const char *who, int eq, int argc
ph = scheme_alloc_object(); ph = scheme_alloc_object();
ph->type = scheme_table_placeholder_type; ph->type = scheme_table_placeholder_type;
SCHEME_IPTR_VAL(ph) = argv[0]; SCHEME_IPTR_VAL(ph) = argv[0];
SCHEME_PINT_VAL(ph) = eq; SCHEME_PINT_VAL(ph) = kind;
return ph; return ph;
} }
static Scheme_Object *make_hash_placeholder(int argc, Scheme_Object *argv[]) static Scheme_Object *make_hash_placeholder(int argc, Scheme_Object *argv[])
{ {
return do_make_hash_placeholder("make-hash-placeholder", 0, argc, argv); return do_make_hash_placeholder("make-hash-placeholder", 1, argc, argv);
} }
static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[]) static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[])
@ -2177,6 +2315,11 @@ static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[])
return do_make_hash_placeholder("make-hash-placeholder", 0, argc, argv); return do_make_hash_placeholder("make-hash-placeholder", 0, argc, argv);
} }
static Scheme_Object *make_hasheqv_placeholder(int argc, Scheme_Object *argv[])
{
return do_make_hash_placeholder("make-hasheqv-placeholder", 2, argc, argv);
}
static Scheme_Object *table_placeholder_p(int c, Scheme_Object *p[]) static Scheme_Object *table_placeholder_p(int c, Scheme_Object *p[])
{ {
return (SAME_TYPE(SCHEME_TYPE(p[0]), scheme_table_placeholder_type) return (SAME_TYPE(SCHEME_TYPE(p[0]), scheme_table_placeholder_type)

View File

@ -1842,18 +1842,29 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht,
print_compact(pp, CPT_HASH_TABLE); print_compact(pp, CPT_HASH_TABLE);
if ((SCHEME_HASHTP(obj) && scheme_is_hash_table_equal(obj)) if ((SCHEME_HASHTP(obj) && scheme_is_hash_table_equal(obj))
|| (SCHEME_HASHTRP(obj) && scheme_is_hash_tree_equal(obj))) || (SCHEME_HASHTRP(obj) && scheme_is_hash_tree_equal(obj)))
print_compact_number(pp, 0);
else
print_compact_number(pp, 1); print_compact_number(pp, 1);
else if ((SCHEME_HASHTP(obj) && scheme_is_hash_table_eqv(obj))
|| (SCHEME_HASHTRP(obj) && scheme_is_hash_tree_eqv(obj)))
print_compact_number(pp, 2);
else
print_compact_number(pp, 0);
} else { } else {
always_scheme(pp, 1); always_scheme(pp, 1);
print_utf8_string(pp, "#hash", 0, 5); print_utf8_string(pp, "#hash", 0, 5);
if (SCHEME_HASHTP(obj)) { if (SCHEME_HASHTP(obj)) {
if (!scheme_is_hash_table_equal(obj)) if (!scheme_is_hash_table_equal(obj)) {
print_utf8_string(pp, "eq", 0, 2); if (scheme_is_hash_table_eqv(obj))
print_utf8_string(pp, "eqv", 0, 3);
else
print_utf8_string(pp, "eq", 0, 2);
}
} else { } else {
if (!scheme_is_hash_tree_equal(obj)) if (!scheme_is_hash_tree_equal(obj)) {
print_utf8_string(pp, "eq", 0, 2); if (scheme_is_hash_tree_eqv(obj))
print_utf8_string(pp, "eqv", 0, 3);
else
print_utf8_string(pp, "eq", 0, 2);
}
} }
print_utf8_string(pp, "(", 0, 1); print_utf8_string(pp, "(", 0, 1);
} }

View File

@ -243,7 +243,7 @@ static Scheme_Object *read_box(Scheme_Object *port, Scheme_Object *stxsrc,
ReadParams *params); ReadParams *params);
static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc,
long line, long col, long pos, long line, long col, long pos,
int opener, char closer, int eq, int opener, char closer, int kind,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, Scheme_Object *indentation,
ReadParams *params); ReadParams *params);
@ -1507,7 +1507,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
return v; return v;
} else { } else {
GC_CAN_IGNORE const mzchar str[] = { 's', 'h', 'e', 'q', 0 }; GC_CAN_IGNORE const mzchar str[] = { 's', 'h', 'e', 'q', 'v', 0 };
int scanpos = 0, failed = 0; int scanpos = 0, failed = 0;
do { do {
@ -1515,7 +1515,7 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
if ((mzchar)ch == str[scanpos]) { if ((mzchar)ch == str[scanpos]) {
scanpos++; scanpos++;
} else { } else {
if (scanpos == 2) { if ((scanpos == 2) || (scanpos == 4)) {
int effective_ch; int effective_ch;
effective_ch = readtable_effective_char(table, ch); effective_ch = readtable_effective_char(table, ch);
if (!(effective_ch == '(') if (!(effective_ch == '(')
@ -1530,19 +1530,26 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table *
if (!failed) { if (!failed) {
/* Found recognized tag. Look for open paren... */ /* Found recognized tag. Look for open paren... */
int effective_ch; int effective_ch, kind;
if (scanpos > 2) if (scanpos > 4)
ch = scheme_getc_special_ok(port); ch = scheme_getc_special_ok(port);
effective_ch = readtable_effective_char(table, ch); effective_ch = readtable_effective_char(table, ch);
if (scanpos == 4)
kind = 0;
else if (scanpos == 2)
kind = 1;
else
kind = 2;
if (effective_ch == '(') if (effective_ch == '(')
return read_hash(port, stxsrc, line, col, pos, ch, ')', (scanpos == 4), ht, indentation, params); return read_hash(port, stxsrc, line, col, pos, ch, ')', kind, ht, indentation, params);
if (effective_ch == '[' && params->square_brackets_are_parens) if (effective_ch == '[' && params->square_brackets_are_parens)
return read_hash(port, stxsrc, line, col, pos, ch, ']', (scanpos == 4), ht, indentation, params); return read_hash(port, stxsrc, line, col, pos, ch, ']', kind, ht, indentation, params);
if (effective_ch == '{' && params->curly_braces_are_parens) if (effective_ch == '{' && params->curly_braces_are_parens)
return read_hash(port, stxsrc, line, col, pos, ch, '}', (scanpos == 4), ht, indentation, params); return read_hash(port, stxsrc, line, col, pos, ch, '}', kind, ht, indentation, params);
} }
/* Report an error. So far, we read 'ha', then scanpos chars of str, then ch. */ /* Report an error. So far, we read 'ha', then scanpos chars of str, then ch. */
@ -2048,11 +2055,16 @@ static Scheme_Object *resolve_references(Scheme_Object *obj,
|| SCHEME_HASHTRP(obj)) { || SCHEME_HASHTRP(obj)) {
Scheme_Hash_Tree *t, *base; Scheme_Hash_Tree *t, *base;
Scheme_Object *a, *key, *val, *lst; Scheme_Object *a, *key, *val, *lst;
int eq; int kind;
if (SCHEME_HASHTRP(obj)) { if (SCHEME_HASHTRP(obj)) {
int i; int i;
eq = !scheme_is_hash_tree_equal(obj); if (scheme_is_hash_tree_equal(obj))
kind = 1;
else if (scheme_is_hash_tree_equal(obj))
kind = 2;
else
kind = 0;
t = (Scheme_Hash_Tree *)obj; t = (Scheme_Hash_Tree *)obj;
lst = scheme_null; lst = scheme_null;
for (i = t->count; i--; ) { for (i = t->count; i--; ) {
@ -2060,13 +2072,13 @@ static Scheme_Object *resolve_references(Scheme_Object *obj,
lst = scheme_make_pair(scheme_make_pair(key, val), lst); lst = scheme_make_pair(scheme_make_pair(key, val), lst);
} }
} else { } else {
eq = SCHEME_PINT_VAL(obj); kind = SCHEME_PINT_VAL(obj);
lst = SCHEME_IPTR_VAL(obj); lst = SCHEME_IPTR_VAL(obj);
} }
/* Create `t' to be overwritten, and create `base' to extend. */ /* Create `t' to be overwritten, and create `base' to extend. */
t = scheme_make_hash_tree(!eq); t = scheme_make_hash_tree(kind);
base = scheme_make_hash_tree(!eq); base = scheme_make_hash_tree(kind);
result = (Scheme_Object *)t; result = (Scheme_Object *)t;
scheme_hash_set(dht, obj, result); scheme_hash_set(dht, obj, result);
@ -3947,7 +3959,7 @@ static Scheme_Object *read_box(Scheme_Object *port,
/* "(" has been read */ /* "(" has been read */
static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc, static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc,
long line, long col, long pos, long line, long col, long pos,
int opener, char closer, int eq, int opener, char closer, int kind,
Scheme_Hash_Table **ht, Scheme_Hash_Table **ht,
Scheme_Object *indentation, ReadParams *params) Scheme_Object *indentation, ReadParams *params)
{ {
@ -3960,7 +3972,7 @@ static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc,
Scheme_Object *key, *val; Scheme_Object *key, *val;
Scheme_Hash_Tree *t; Scheme_Hash_Tree *t;
t = scheme_make_hash_tree(!eq); t = scheme_make_hash_tree(kind);
l = scheme_syntax_to_datum(l, 0, NULL); l = scheme_syntax_to_datum(l, 0, NULL);
@ -3981,7 +3993,7 @@ static Scheme_Object *read_hash(Scheme_Object *port, Scheme_Object *stxsrc,
ph = scheme_alloc_object(); ph = scheme_alloc_object();
ph->type = scheme_table_placeholder_type; ph->type = scheme_table_placeholder_type;
SCHEME_IPTR_VAL(ph) = l; SCHEME_IPTR_VAL(ph) = l;
SCHEME_PINT_VAL(ph) = eq; SCHEME_PINT_VAL(ph) = kind;
if (!*ht) { if (!*ht) {
/* So that resolve_references is called to build the table: */ /* So that resolve_references is called to build the table: */
@ -4565,9 +4577,9 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
case CPT_HASH_TABLE: case CPT_HASH_TABLE:
{ {
Scheme_Object *l; Scheme_Object *l;
int eq, len; int kind, len;
eq = read_compact_number(port); kind = read_compact_number(port);
len = read_compact_number(port); len = read_compact_number(port);
l = scheme_null; l = scheme_null;
@ -4590,7 +4602,7 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
/* Let resolve_references complete the table construction: */ /* Let resolve_references complete the table construction: */
v = scheme_alloc_object(); v = scheme_alloc_object();
v->type = scheme_table_placeholder_type; v->type = scheme_table_placeholder_type;
SCHEME_PINT_VAL(v) = eq; SCHEME_PINT_VAL(v) = kind;
SCHEME_IPTR_VAL(v) = l; SCHEME_IPTR_VAL(v) = l;
} }
break; break;

View File

@ -423,6 +423,7 @@ MZ_EXTERN Scheme_Bucket_Table *scheme_clone_bucket_table(Scheme_Bucket_Table *bt
MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table(int type); MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table(int type);
MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_equal(); MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_equal();
MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_eqv();
MZ_EXTERN void scheme_hash_set(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); MZ_EXTERN void scheme_hash_set(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
MZ_EXTERN Scheme_Object *scheme_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); MZ_EXTERN Scheme_Object *scheme_hash_get(Scheme_Hash_Table *table, Scheme_Object *key);
XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_eq_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_eq_hash_get(Scheme_Hash_Table *table, Scheme_Object *key);
@ -430,15 +431,17 @@ MZ_EXTERN void scheme_hash_set_atomic(Scheme_Hash_Table *table, Scheme_Object *k
MZ_EXTERN Scheme_Object *scheme_hash_get_atomic(Scheme_Hash_Table *table, Scheme_Object *key); MZ_EXTERN Scheme_Object *scheme_hash_get_atomic(Scheme_Hash_Table *table, Scheme_Object *key);
MZ_EXTERN int scheme_hash_table_equal(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2); MZ_EXTERN int scheme_hash_table_equal(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2);
MZ_EXTERN int scheme_is_hash_table_equal(Scheme_Object *o); MZ_EXTERN int scheme_is_hash_table_equal(Scheme_Object *o);
MZ_EXTERN int scheme_is_hash_table_eqv(Scheme_Object *o);
MZ_EXTERN Scheme_Hash_Table *scheme_clone_hash_table(Scheme_Hash_Table *bt); MZ_EXTERN Scheme_Hash_Table *scheme_clone_hash_table(Scheme_Hash_Table *bt);
MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree(int eql); MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree(int kind);
MZ_EXTERN Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val); MZ_EXTERN Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val);
MZ_EXTERN Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key); MZ_EXTERN Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key);
MZ_EXTERN long scheme_hash_tree_next(Scheme_Hash_Tree *tree, long pos); MZ_EXTERN long scheme_hash_tree_next(Scheme_Hash_Tree *tree, long pos);
MZ_EXTERN int scheme_hash_tree_index(Scheme_Hash_Tree *tree, long pos, Scheme_Object **_key, Scheme_Object **_val); MZ_EXTERN int scheme_hash_tree_index(Scheme_Hash_Tree *tree, long pos, Scheme_Object **_key, Scheme_Object **_val);
MZ_EXTERN int scheme_hash_tree_equal(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2); MZ_EXTERN int scheme_hash_tree_equal(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2);
MZ_EXTERN int scheme_is_hash_tree_equal(Scheme_Object *o); MZ_EXTERN int scheme_is_hash_tree_equal(Scheme_Object *o);
MZ_EXTERN int scheme_is_hash_tree_eqv(Scheme_Object *o);
/*========================================================================*/ /*========================================================================*/
/* basic Scheme value constructors */ /* basic Scheme value constructors */
@ -1011,6 +1014,8 @@ MZ_EXTERN long scheme_equal_hash_key(Scheme_Object *o);
MZ_EXTERN long scheme_equal_hash_key2(Scheme_Object *o); MZ_EXTERN long scheme_equal_hash_key2(Scheme_Object *o);
MZ_EXTERN long scheme_recur_equal_hash_key(Scheme_Object *o, void *cycle_data); MZ_EXTERN long scheme_recur_equal_hash_key(Scheme_Object *o, void *cycle_data);
MZ_EXTERN long scheme_recur_equal_hash_key2(Scheme_Object *o, void *cycle_data); MZ_EXTERN long scheme_recur_equal_hash_key2(Scheme_Object *o, void *cycle_data);
MZ_EXTERN long scheme_eqv_hash_key(Scheme_Object *o);
MZ_EXTERN long scheme_eqv_hash_key2(Scheme_Object *o);
MZ_EXTERN void scheme_set_type_equality(Scheme_Type type, MZ_EXTERN void scheme_set_type_equality(Scheme_Type type,
Scheme_Equal_Proc f, Scheme_Equal_Proc f,

View File

@ -343,6 +343,7 @@ int (*scheme_bucket_table_equal)(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t
Scheme_Bucket_Table *(*scheme_clone_bucket_table)(Scheme_Bucket_Table *bt); Scheme_Bucket_Table *(*scheme_clone_bucket_table)(Scheme_Bucket_Table *bt);
Scheme_Hash_Table *(*scheme_make_hash_table)(int type); Scheme_Hash_Table *(*scheme_make_hash_table)(int type);
Scheme_Hash_Table *(*scheme_make_hash_table_equal)(); Scheme_Hash_Table *(*scheme_make_hash_table_equal)();
Scheme_Hash_Table *(*scheme_make_hash_table_eqv)();
void (*scheme_hash_set)(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); void (*scheme_hash_set)(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *(*scheme_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key); Scheme_Object *(*scheme_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key);
Scheme_Object *(*scheme_eq_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key); Scheme_Object *(*scheme_eq_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key);
@ -350,14 +351,16 @@ void (*scheme_hash_set_atomic)(Scheme_Hash_Table *table, Scheme_Object *key, Sch
Scheme_Object *(*scheme_hash_get_atomic)(Scheme_Hash_Table *table, Scheme_Object *key); Scheme_Object *(*scheme_hash_get_atomic)(Scheme_Hash_Table *table, Scheme_Object *key);
int (*scheme_hash_table_equal)(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2); int (*scheme_hash_table_equal)(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2);
int (*scheme_is_hash_table_equal)(Scheme_Object *o); int (*scheme_is_hash_table_equal)(Scheme_Object *o);
int (*scheme_is_hash_table_eqv)(Scheme_Object *o);
Scheme_Hash_Table *(*scheme_clone_hash_table)(Scheme_Hash_Table *bt); Scheme_Hash_Table *(*scheme_clone_hash_table)(Scheme_Hash_Table *bt);
Scheme_Hash_Tree *(*scheme_make_hash_tree)(int eql); Scheme_Hash_Tree *(*scheme_make_hash_tree)(int kind);
Scheme_Hash_Tree *(*scheme_hash_tree_set)(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val); Scheme_Hash_Tree *(*scheme_hash_tree_set)(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *(*scheme_hash_tree_get)(Scheme_Hash_Tree *tree, Scheme_Object *key); Scheme_Object *(*scheme_hash_tree_get)(Scheme_Hash_Tree *tree, Scheme_Object *key);
long (*scheme_hash_tree_next)(Scheme_Hash_Tree *tree, long pos); long (*scheme_hash_tree_next)(Scheme_Hash_Tree *tree, long pos);
int (*scheme_hash_tree_index)(Scheme_Hash_Tree *tree, long pos, Scheme_Object **_key, Scheme_Object **_val); int (*scheme_hash_tree_index)(Scheme_Hash_Tree *tree, long pos, Scheme_Object **_key, Scheme_Object **_val);
int (*scheme_hash_tree_equal)(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2); int (*scheme_hash_tree_equal)(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2);
int (*scheme_is_hash_tree_equal)(Scheme_Object *o); int (*scheme_is_hash_tree_equal)(Scheme_Object *o);
int (*scheme_is_hash_tree_eqv)(Scheme_Object *o);
/*========================================================================*/ /*========================================================================*/
/* basic Scheme value constructors */ /* basic Scheme value constructors */
/*========================================================================*/ /*========================================================================*/
@ -839,6 +842,8 @@ long (*scheme_equal_hash_key)(Scheme_Object *o);
long (*scheme_equal_hash_key2)(Scheme_Object *o); long (*scheme_equal_hash_key2)(Scheme_Object *o);
long (*scheme_recur_equal_hash_key)(Scheme_Object *o, void *cycle_data); long (*scheme_recur_equal_hash_key)(Scheme_Object *o, void *cycle_data);
long (*scheme_recur_equal_hash_key2)(Scheme_Object *o, void *cycle_data); long (*scheme_recur_equal_hash_key2)(Scheme_Object *o, void *cycle_data);
long (*scheme_eqv_hash_key)(Scheme_Object *o);
long (*scheme_eqv_hash_key2)(Scheme_Object *o);
void (*scheme_set_type_equality)(Scheme_Type type, void (*scheme_set_type_equality)(Scheme_Type type,
Scheme_Equal_Proc f, Scheme_Equal_Proc f,
Scheme_Primary_Hash_Proc hash1, Scheme_Primary_Hash_Proc hash1,

View File

@ -239,6 +239,7 @@
scheme_extension_table->scheme_clone_bucket_table = scheme_clone_bucket_table; scheme_extension_table->scheme_clone_bucket_table = scheme_clone_bucket_table;
scheme_extension_table->scheme_make_hash_table = scheme_make_hash_table; scheme_extension_table->scheme_make_hash_table = scheme_make_hash_table;
scheme_extension_table->scheme_make_hash_table_equal = scheme_make_hash_table_equal; scheme_extension_table->scheme_make_hash_table_equal = scheme_make_hash_table_equal;
scheme_extension_table->scheme_make_hash_table_eqv = scheme_make_hash_table_eqv;
scheme_extension_table->scheme_hash_set = scheme_hash_set; scheme_extension_table->scheme_hash_set = scheme_hash_set;
scheme_extension_table->scheme_hash_get = scheme_hash_get; scheme_extension_table->scheme_hash_get = scheme_hash_get;
scheme_extension_table->scheme_eq_hash_get = scheme_eq_hash_get; scheme_extension_table->scheme_eq_hash_get = scheme_eq_hash_get;
@ -246,6 +247,7 @@
scheme_extension_table->scheme_hash_get_atomic = scheme_hash_get_atomic; scheme_extension_table->scheme_hash_get_atomic = scheme_hash_get_atomic;
scheme_extension_table->scheme_hash_table_equal = scheme_hash_table_equal; scheme_extension_table->scheme_hash_table_equal = scheme_hash_table_equal;
scheme_extension_table->scheme_is_hash_table_equal = scheme_is_hash_table_equal; scheme_extension_table->scheme_is_hash_table_equal = scheme_is_hash_table_equal;
scheme_extension_table->scheme_is_hash_table_eqv = scheme_is_hash_table_eqv;
scheme_extension_table->scheme_clone_hash_table = scheme_clone_hash_table; scheme_extension_table->scheme_clone_hash_table = scheme_clone_hash_table;
scheme_extension_table->scheme_make_hash_tree = scheme_make_hash_tree; scheme_extension_table->scheme_make_hash_tree = scheme_make_hash_tree;
scheme_extension_table->scheme_hash_tree_set = scheme_hash_tree_set; scheme_extension_table->scheme_hash_tree_set = scheme_hash_tree_set;
@ -254,6 +256,7 @@
scheme_extension_table->scheme_hash_tree_index = scheme_hash_tree_index; scheme_extension_table->scheme_hash_tree_index = scheme_hash_tree_index;
scheme_extension_table->scheme_hash_tree_equal = scheme_hash_tree_equal; scheme_extension_table->scheme_hash_tree_equal = scheme_hash_tree_equal;
scheme_extension_table->scheme_is_hash_tree_equal = scheme_is_hash_tree_equal; scheme_extension_table->scheme_is_hash_tree_equal = scheme_is_hash_tree_equal;
scheme_extension_table->scheme_is_hash_tree_eqv = scheme_is_hash_tree_eqv;
scheme_extension_table->scheme_make_prim = scheme_make_prim; scheme_extension_table->scheme_make_prim = scheme_make_prim;
scheme_extension_table->scheme_make_noneternal_prim = scheme_make_noneternal_prim; scheme_extension_table->scheme_make_noneternal_prim = scheme_make_noneternal_prim;
scheme_extension_table->scheme_make_prim_w_arity = scheme_make_prim_w_arity; scheme_extension_table->scheme_make_prim_w_arity = scheme_make_prim_w_arity;
@ -577,6 +580,8 @@
scheme_extension_table->scheme_equal_hash_key2 = scheme_equal_hash_key2; scheme_extension_table->scheme_equal_hash_key2 = scheme_equal_hash_key2;
scheme_extension_table->scheme_recur_equal_hash_key = scheme_recur_equal_hash_key; scheme_extension_table->scheme_recur_equal_hash_key = scheme_recur_equal_hash_key;
scheme_extension_table->scheme_recur_equal_hash_key2 = scheme_recur_equal_hash_key2; scheme_extension_table->scheme_recur_equal_hash_key2 = scheme_recur_equal_hash_key2;
scheme_extension_table->scheme_eqv_hash_key = scheme_eqv_hash_key;
scheme_extension_table->scheme_eqv_hash_key2 = scheme_eqv_hash_key2;
scheme_extension_table->scheme_set_type_equality = scheme_set_type_equality; scheme_extension_table->scheme_set_type_equality = scheme_set_type_equality;
scheme_extension_table->scheme_recur_equal = scheme_recur_equal; scheme_extension_table->scheme_recur_equal = scheme_recur_equal;
scheme_extension_table->scheme_build_list = scheme_build_list; scheme_extension_table->scheme_build_list = scheme_build_list;

View File

@ -239,6 +239,7 @@
#define scheme_clone_bucket_table (scheme_extension_table->scheme_clone_bucket_table) #define scheme_clone_bucket_table (scheme_extension_table->scheme_clone_bucket_table)
#define scheme_make_hash_table (scheme_extension_table->scheme_make_hash_table) #define scheme_make_hash_table (scheme_extension_table->scheme_make_hash_table)
#define scheme_make_hash_table_equal (scheme_extension_table->scheme_make_hash_table_equal) #define scheme_make_hash_table_equal (scheme_extension_table->scheme_make_hash_table_equal)
#define scheme_make_hash_table_eqv (scheme_extension_table->scheme_make_hash_table_eqv)
#define scheme_hash_set (scheme_extension_table->scheme_hash_set) #define scheme_hash_set (scheme_extension_table->scheme_hash_set)
#define scheme_hash_get (scheme_extension_table->scheme_hash_get) #define scheme_hash_get (scheme_extension_table->scheme_hash_get)
#define scheme_eq_hash_get (scheme_extension_table->scheme_eq_hash_get) #define scheme_eq_hash_get (scheme_extension_table->scheme_eq_hash_get)
@ -246,6 +247,7 @@
#define scheme_hash_get_atomic (scheme_extension_table->scheme_hash_get_atomic) #define scheme_hash_get_atomic (scheme_extension_table->scheme_hash_get_atomic)
#define scheme_hash_table_equal (scheme_extension_table->scheme_hash_table_equal) #define scheme_hash_table_equal (scheme_extension_table->scheme_hash_table_equal)
#define scheme_is_hash_table_equal (scheme_extension_table->scheme_is_hash_table_equal) #define scheme_is_hash_table_equal (scheme_extension_table->scheme_is_hash_table_equal)
#define scheme_is_hash_table_eqv (scheme_extension_table->scheme_is_hash_table_eqv)
#define scheme_clone_hash_table (scheme_extension_table->scheme_clone_hash_table) #define scheme_clone_hash_table (scheme_extension_table->scheme_clone_hash_table)
#define scheme_make_hash_tree (scheme_extension_table->scheme_make_hash_tree) #define scheme_make_hash_tree (scheme_extension_table->scheme_make_hash_tree)
#define scheme_hash_tree_set (scheme_extension_table->scheme_hash_tree_set) #define scheme_hash_tree_set (scheme_extension_table->scheme_hash_tree_set)
@ -254,6 +256,7 @@
#define scheme_hash_tree_index (scheme_extension_table->scheme_hash_tree_index) #define scheme_hash_tree_index (scheme_extension_table->scheme_hash_tree_index)
#define scheme_hash_tree_equal (scheme_extension_table->scheme_hash_tree_equal) #define scheme_hash_tree_equal (scheme_extension_table->scheme_hash_tree_equal)
#define scheme_is_hash_tree_equal (scheme_extension_table->scheme_is_hash_tree_equal) #define scheme_is_hash_tree_equal (scheme_extension_table->scheme_is_hash_tree_equal)
#define scheme_is_hash_tree_eqv (scheme_extension_table->scheme_is_hash_tree_eqv)
#define scheme_make_prim (scheme_extension_table->scheme_make_prim) #define scheme_make_prim (scheme_extension_table->scheme_make_prim)
#define scheme_make_noneternal_prim (scheme_extension_table->scheme_make_noneternal_prim) #define scheme_make_noneternal_prim (scheme_extension_table->scheme_make_noneternal_prim)
#define scheme_make_prim_w_arity (scheme_extension_table->scheme_make_prim_w_arity) #define scheme_make_prim_w_arity (scheme_extension_table->scheme_make_prim_w_arity)
@ -577,6 +580,8 @@
#define scheme_equal_hash_key2 (scheme_extension_table->scheme_equal_hash_key2) #define scheme_equal_hash_key2 (scheme_extension_table->scheme_equal_hash_key2)
#define scheme_recur_equal_hash_key (scheme_extension_table->scheme_recur_equal_hash_key) #define scheme_recur_equal_hash_key (scheme_extension_table->scheme_recur_equal_hash_key)
#define scheme_recur_equal_hash_key2 (scheme_extension_table->scheme_recur_equal_hash_key2) #define scheme_recur_equal_hash_key2 (scheme_extension_table->scheme_recur_equal_hash_key2)
#define scheme_eqv_hash_key (scheme_extension_table->scheme_eqv_hash_key)
#define scheme_eqv_hash_key2 (scheme_extension_table->scheme_eqv_hash_key2)
#define scheme_set_type_equality (scheme_extension_table->scheme_set_type_equality) #define scheme_set_type_equality (scheme_extension_table->scheme_set_type_equality)
#define scheme_recur_equal (scheme_extension_table->scheme_recur_equal) #define scheme_recur_equal (scheme_extension_table->scheme_recur_equal)
#define scheme_build_list (scheme_extension_table->scheme_build_list) #define scheme_build_list (scheme_extension_table->scheme_build_list)

View File

@ -13,7 +13,7 @@
#define USE_COMPILED_STARTUP 1 #define USE_COMPILED_STARTUP 1
#define EXPECTED_PRIM_COUNT 929 #define EXPECTED_PRIM_COUNT 935
#ifdef MZSCHEME_SOMETHING_OMITTED #ifdef MZSCHEME_SOMETHING_OMITTED
# undef USE_COMPILED_STARTUP # undef USE_COMPILED_STARTUP

View File

@ -530,7 +530,7 @@ Scheme_Bucket *scheme_bucket_or_null_from_table(Scheme_Bucket_Table *table, cons
struct Scheme_Hash_Tree struct Scheme_Hash_Tree
{ {
Scheme_Inclhash_Object iso; /* 0x1 flag => equal?-based hashing */ Scheme_Inclhash_Object iso; /* 0x1 flag => equal?-based hashing; 0x2 flag => eqv?-based hashing */
int count; int count;
struct RBNode *root; struct RBNode *root;
Scheme_Object *elems_box; /* vector in a weak box */ Scheme_Object *elems_box; /* vector in a weak box */

View File

@ -13,12 +13,12 @@
consistently.) consistently.)
*/ */
#define MZSCHEME_VERSION "4.1.1.1" #define MZSCHEME_VERSION "4.1.1.2"
#define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_X 4
#define MZSCHEME_VERSION_Y 1 #define MZSCHEME_VERSION_Y 1
#define MZSCHEME_VERSION_Z 1 #define MZSCHEME_VERSION_Z 1
#define MZSCHEME_VERSION_W 1 #define MZSCHEME_VERSION_W 2
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)