diff --git a/collects/mzlib/restart.rkt b/collects/mzlib/restart.rkt index 4e1def8adf..cf6777055d 100644 --- a/collects/mzlib/restart.rkt +++ b/collects/mzlib/restart.rkt @@ -97,7 +97,7 @@ (let ([n (make-base-empty-namespace)] [argv (if args (list->vector args) (vector))]) (parameterize ([current-command-line-arguments argv] - [print-as-quasiquote #f]) + [print-as-expression #f]) (thread-wait (thread (lambda () diff --git a/collects/racket/pretty.rkt b/collects/racket/pretty.rkt index 8145448c31..2259ff6eb5 100644 --- a/collects/racket/pretty.rkt +++ b/collects/racket/pretty.rkt @@ -221,7 +221,7 @@ (pretty-print-print-line)) (print-graph) (print-struct) (print-hash-table) (and (not display?) (print-vector-length)) (print-box) - (and (not display?) as-qq? (print-as-quasiquote)) + (and (not display?) as-qq? (print-as-expression)) (pretty-print-depth) (lambda (o display?) (size-hook o display? port))) @@ -488,14 +488,8 @@ (ormap loop (vector->list (struct->vector obj)))] [(hash? obj) - (let/ec esc - (hash-for-each - obj - (lambda (v k) - (when (or (loop v) - (loop k)) - (esc #t)))) - #f)])]) + (for/or ([(k v) (in-hash obj)]) + (or (loop v) (loop k)))])]) (hash-remove! table obj) cycle))))))) @@ -548,6 +542,67 @@ (make-mark #f (box #f))))))) (void))))) + (define (custom-print? obj) + (and (custom-print-as-constructor? obj) + (custom-print-as-constructor-accessor obj))) + + (define escapes-table + (let* ([table (make-hasheq)] + [local-cycle (and found-cycle (make-hasheq))] + [escapes! (lambda (obj) + (hash-set! table obj #t) + #t)] + [orf (lambda (a b) (or a b))]) + (and print-as-qq? + (let loop ([obj obj]) + (if (and local-cycle (hash-ref local-cycle obj #f)) + #f + (begin + (when local-cycle + (hash-set! local-cycle obj #t)) + (begin0 + (cond + [ #f] + [(vector? obj) + (let ([len (vector-length obj)]) + (let vloop ([esc? #f][i 0]) + (if (= i len) + (and esc? + (escapes! obj)) + (vloop (or (loop (vector-ref obj i)) esc?) + (add1 i)))))] + [(pair? obj) + (and (orf (loop (car obj)) + (loop (cdr obj))) + (escapes! obj))] + [(mpair? obj) + (loop (mcar obj)) + (loop (mcdr obj)) + ;; always unquoted: + #t] + [(and (box? obj) print-box?) + (and (loop (unbox obj)) + (escapes! obj))] + [(and (custom-write? obj) + (not (struct-type? obj))) + (and (or (loop (extract-sub-objects obj pport)) + (custom-print? obj)) + (escapes! obj))] + [(struct? obj) + (and (or (loop (struct->vector obj)) + (not (prefab-struct-key obj))) + (escapes! obj))] + [(hash? obj) + (and (for/fold ([esc? #f]) ([(k v) (in-hash obj)]) + (or (orf (loop v) + (loop k)) + esc?)) + (escapes! obj))] + [else #f]) + (when local-cycle + (hash-remove! local-cycle obj))))))) + table)) + (define cycle-counter 0) (define found (if found-cycle @@ -615,8 +670,44 @@ (register-printing-port-like p pport) (parameterize ([pretty-printing #t] [pretty-print-columns (or width 'infinity)]) - ((custom-write-accessor obj) obj p (not display?)))))) + ((custom-write-accessor obj) obj p (or qd (not display?))))))) + ;; ------------------------------------------------------------ + + (define (convert-pair obj) + (cond + [(list? obj) (cons (make-unquoted 'list) + ;; reconstruct first pair in case it + ;; starts a cycle: + (cons (car obj) (cdr obj)))] + [(and (pair? (cdr obj)) + (not (and found + (hash-ref found (cdr obj) #f)))) + (cons (make-unquoted 'list*) + (cons + (car obj) + (let loop ([obj (cdr obj)]) + (cond + [(and found (hash-ref found obj #f)) (list obj)] + [(pair? obj) (cons (car obj) (loop (cdr obj)))] + [else (list obj)]))))] + [else (list (make-unquoted 'cons) (car obj) (cdr obj))])) + + (define (convert-hash obj expr?) + (let ([l (hash-map obj (lambda (k v) + (if expr? + (list k v) + (cons k (make-hide v)))))]) + (if expr? + (cons (make-unquoted + (if (hash-eq? obj) + 'hasheq + (if (hash-eqv? obj) + 'hasheqv + 'hash))) + (apply append l)) + l))) + ;; ------------------------------------------------------------ ;; wr: write on a single line (define (wr* pport obj depth display? qd) @@ -637,47 +728,43 @@ (define (wr-lst l check? depth pair? car cdr open close qd) (if (pair? l) - (check-expr-found - l pport check? - #f #f - (lambda () - (if (and depth (zero? depth)) - (begin - (out open) - (out "...") - (out close)) - (begin - (out open) - (wr (car l) (dsub1 depth) qd) - (let loop ([l (cdr l)]) - (check-expr-found - l pport (and check? (pair? l)) - (lambda (s) (out " . ") (out s) (out close)) - (lambda () - (out " . ") - (wr-lst l check? (dsub1 depth) pair? car cdr open close qd) - (out close)) - (lambda () - (cond - [(pair? l) - (if (and (eq? (do-remap (car l)) 'unquote) - (not (equal? qd 1)) - (pair? (cdr l)) - (null? (cdr (cdr l)))) - (begin - (out " . ,") - (wr (car (cdr l)) (dsub1 depth) - (reader-adjust-qd (car l) qd)) - (out close)) - (begin - (out " ") - (wr (car l) (dsub1 depth) qd) - (loop (cdr l))))] - [(null? l) (out close)] - [else - (out " . ") - (wr l (dsub1 depth) qd) - (out close)])))))))) + (if (and depth (zero? depth)) + (begin + (out open) + (out "...") + (out close)) + (begin + (out open) + (wr (car l) (dsub1 depth) qd) + (let loop ([l (cdr l)]) + (check-expr-found + l pport (and check? (pair? l)) + (lambda (s) (out " . ") (out s) (out close)) + (lambda () + (out " . ") + (wr-lst l check? (dsub1 depth) pair? car cdr open close qd) + (out close)) + (lambda () + (cond + [(pair? l) + (if (and (eq? (do-remap (car l)) 'unquote) + (not (equal? qd 1)) + (pair? (cdr l)) + (null? (cdr (cdr l)))) + (begin + (out " . ,") + (wr (car (cdr l)) (dsub1 depth) + (reader-adjust-qd (car l) qd)) + (out close)) + (begin + (out " ") + (wr (car l) (dsub1 depth) qd) + (loop (cdr l))))] + [(null? l) (out close)] + [else + (out " . ") + (wr l (dsub1 depth) qd) + (out close)])))))) (begin (out open) (out close)))) @@ -694,34 +781,56 @@ => (lambda (len) (output-hooked pport obj len display?))] - [(pair? obj) - (let ([qd (to-quoted out qd "`")]) - (wr-expr obj depth pair? car cdr pair-open pair-close qd))] + [(pair? obj) + (check-expr-found + obj pport #t + #f #f + (lambda () + (let* ([qd (to-quoted out qd obj)] + [pair (if (and qd (zero? qd)) + (convert-pair obj) + obj)]) + (wr-expr pair depth pair? car cdr pair-open pair-close qd))))] [(mpair? obj) - (let ([qd (to-quoted out qd "`")]) - (wr-expr obj depth mpair? mcar mcdr mpair-open mpair-close qd))] + (check-expr-found + obj pport #t + #f #f + (lambda () + (if (and qd (zero? qd)) + (wr-expr (list (make-unquoted 'mcons) (mcar obj) (mcdr obj)) + depth pair? car cdr pair-open pair-close qd) + (wr-expr obj depth mpair? mcar mcdr mpair-open mpair-close qd))))] [(null? obj) - (let ([qd (to-quoted out qd "'")]) + (let ([qd (to-quoted out qd obj)]) (wr-lst obj #f depth pair? car cdr "(" ")" qd))] [(vector? obj) (check-expr-found obj pport #t #f #f (lambda () - (let ([qd (to-quoted out qd "`")]) - (out "#") - (when print-vec-length? - (out (number->string (vector-length obj)))) - (wr-lst (vector->repeatless-list obj) #f depth pair? car cdr "(" ")" qd))))] + (let ([qd (to-quoted out qd obj)] + [vecl (vector->repeatless-list obj)]) + (if (and qd (zero? qd)) + (wr-lst (cons (make-unquoted 'vector) vecl) + #f depth pair? car cdr "(" ")" qd) + (begin + (out "#") + (when print-vec-length? + (out (number->string (vector-length obj)))) + (wr-lst vecl #f depth pair? car cdr "(" ")" qd))))))] [(and (box? obj) print-box?) (check-expr-found obj pport #t #f #f (lambda () - (let ([qd (to-quoted out qd "`")]) - (out "#&") - (wr (unbox obj) (dsub1 depth) qd))))] + (let ([qd (to-quoted out qd obj)]) + (if (and qd (zero? qd)) + (wr-lst (list (make-unquoted 'box) (unbox obj)) + #f depth pair? car cdr "(" ")" qd) + (begin + (out "#&") + (wr (unbox obj) (dsub1 depth) qd))))))] [(and (custom-write? obj) (not (struct-type? obj))) (check-expr-found @@ -729,7 +838,10 @@ #f #f (lambda () (parameterize ([pretty-print-columns 'infinity]) - (write-custom wr* obj pport depth display? width qd))))] + (let ([qd (if (custom-print? obj) + qd + (to-quoted out qd obj))]) + (write-custom wr* obj pport depth display? width qd)))))] [(struct? obj) (if (and print-struct? (not (and depth @@ -741,13 +853,13 @@ (let* ([v (struct->vector obj struct-ellipses)] [pf? (prefab?! obj v)]) (let ([qd (if pf? - (to-quoted out qd "`") - (to-unquoted out qd))]) - (when (or (not qd) pf?) + (to-quoted out qd obj) + qd)]) + (when (or (not qd) (positive? qd)) (out "#") (when pf? (out "s"))) (wr-lst (let ([l (vector->list v)]) - (if (and qd (not pf?)) + (if (and qd (zero? qd)) (cons (make-unquoted (object-name obj)) (cdr l)) l)) @@ -763,14 +875,15 @@ obj pport #t #f #f (lambda () - (let ([qd (to-quoted out qd "`")]) - (out (if (hash-eq? obj) - "#hasheq" - (if (hash-eqv? obj) - "#hasheqv" - "#hash"))) - (wr-lst (hash-map obj (lambda (k v) - (cons k (make-hide v)))) + (let* ([qd (to-quoted out qd obj)] + [expr? (and qd (zero? qd))]) + (unless expr? + (out (if (hash-eq? obj) + "#hasheq" + (if (hash-eqv? obj) + "#hasheqv" + "#hash")))) + (wr-lst (convert-hash obj expr?) #f depth pair? car cdr "(" ")" qd)))) (parameterize ([print-hash-table #f]) @@ -790,19 +903,13 @@ [(and (pretty-print-.-symbol-without-bars) (eq? obj '|.|)) (out ".")] - [(and (equal? qd 1) - (or (eq? 'unquote obj) - (eq? 'unquote-splicing obj))) - (out ",'") - (orig-write obj pport)] [(and qd (or (symbol? obj) (keyword? obj))) (unless (eq? obj struct-ellipses) - (to-quoted out qd "'")) + (to-quoted out qd obj)) (orig-write obj pport)] [(unquoted? obj) - (let ([qd (to-unquoted out qd)]) - (orig-write (unquoted-val obj) pport))] + (orig-write (unquoted-val obj) pport)] [else ((if display? orig-display orig-write) obj pport)])) (unless (hide? obj) @@ -878,38 +985,54 @@ (pre-print pport obj) (cond [(pair? obj) - (let ([qd (to-quoted out qd "`")]) - (pp-pair obj extra depth + (let* ([qd (to-quoted out qd obj)] + [pair (if (and qd (zero? qd)) + (convert-pair obj) + obj)]) + (pp-pair pair extra depth pair? car cdr pair-open pair-close qd))] [(mpair? obj) - (let ([qd (to-quoted out qd "`")]) - (pp-pair obj extra depth - mpair? mcar mcdr mpair-open mpair-close - qd))] + (if (and qd (zero? qd)) + (pp-pair (list (make-unquoted 'mcons) (mcar obj) (mcdr obj)) + extra depth + pair? car cdr pair-open pair-close + qd) + (pp-pair obj extra depth + mpair? mcar mcdr mpair-open mpair-close + qd))] [(vector? obj) - (let ([qd (to-quoted out qd "`")]) - (out "#") - (when print-vec-length? - (out (number->string (vector-length obj)))) - (pp-list (vector->repeatless-list obj) extra pp-expr #f depth - pair? car cdr pair-open pair-close - qd))] + (let ([qd (to-quoted out qd obj)] + [vecl (vector->repeatless-list obj)]) + (if (and qd (zero? qd)) + (pp-pair (cons (make-unquoted 'vector) vecl) + extra depth + pair? car cdr pair-open pair-close + qd) + (begin + (out "#") + (when print-vec-length? + (out (number->string (vector-length obj)))) + (pp-list vecl extra pp-expr #f depth + pair? car cdr pair-open pair-close + qd))))] [(and (custom-write? obj) (not (struct-type? obj))) - (let ([qd (to-unquoted out qd)]) + (let ([qd (if (custom-print? obj) + qd + (to-quoted out qd obj))]) (write-custom pp* obj pport depth display? width qd))] [(struct? obj) ; print-struct is on if we got here (let* ([v (struct->vector obj struct-ellipses)] [pf? (prefab?! obj v)]) (let ([qd (if pf? - (to-quoted out qd "`") - (to-unquoted out qd))]) - (when (or (not qd) pf?) + (to-quoted out qd obj) + qd)]) + (when (or (not qd) (positive? qd)) (out "#") (when pf? (out "s"))) (pp-list (let ([l (vector->list v)]) - (if (and qd (not pf?)) + (if (and qd (zero? qd)) (cons (make-unquoted (object-name obj)) (cdr l)) l)) @@ -917,19 +1040,27 @@ pair? car cdr pair-open pair-close qd)))] [(hash? obj) - (let ([qd (to-quoted out qd "`")]) - (out (if (hash-eq? obj) - "#hasheq" - (if (hash-eqv? obj) - "#hasheqv" - "#hash"))) - (pp-list (hash-map obj cons) extra pp-expr #f depth + (let* ([qd (to-quoted out qd obj)] + [expr? (and qd (zero? qd))]) + (unless expr? + (out (if (hash-eq? obj) + "#hasheq" + (if (hash-eqv? obj) + "#hasheqv" + "#hash")))) + (pp-list (convert-hash obj expr?) extra pp-expr #f depth pair? car cdr pair-open pair-close qd))] [(and (box? obj) print-box?) - (let ([qd (to-quoted out qd "`")]) - (out "#&") - (pr (unbox obj) extra pp-pair depth qd))]) + (let ([qd (to-quoted out qd obj)]) + (if (and qd (zero? qd)) + (pp-pair (list (make-unquoted 'box) (unbox obj)) + extra depth + pair? car cdr pair-open pair-close + qd) + (begin + (out "#&") + (pr (unbox obj) extra pp-pair depth qd))))]) (post-print pport obj))))) ;; Not possible to split obj across lines; so just write directly (wr* pport obj depth display? qd)))) @@ -953,7 +1084,10 @@ ((pretty-print-remap-stylable) head)) (let ((proc (style head expr apair? acar acdr))) (if proc - (let ([qd (to-quoted out qd "`")]) + (let* ([qd (to-quoted out qd expr)] + [pair (if (and qd (zero? qd)) + (cons (make-unquoted 'list) obj) + obj)]) (proc expr extra depth apair? acar acdr open close qd)) @@ -1264,22 +1398,16 @@ (pr obj 0 pp-expr depth qd)) - (define (to-quoted out qd str) + (define (to-quoted out qd obj) (and qd (if (zero? qd) - (begin - (out str) - (add1 qd)) + (if (hash-ref escapes-table obj #f) + qd + (begin + (out "'") + (add1 qd))) qd))) - (define (to-unquoted out qd) - (and qd - (if (zero? qd) - qd - (begin - (out ",") - (to-unquoted out (sub1 qd)))))) - ;; ------------------------------------------------------------ ;; This is where generic-write's body expressions start diff --git a/collects/racket/runtime-config.rkt b/collects/racket/runtime-config.rkt index 572d8a496b..006bc366d4 100644 --- a/collects/racket/runtime-config.rkt +++ b/collects/racket/runtime-config.rkt @@ -4,4 +4,4 @@ (define-values (configure) (lambda (config) - (print-as-quasiquote #t)))) + (print-as-expression #t)))) diff --git a/collects/redex/tests/tl-test.rkt b/collects/redex/tests/tl-test.rkt index 93b73985b2..f46fa3a98b 100644 --- a/collects/redex/tests/tl-test.rkt +++ b/collects/redex/tests/tl-test.rkt @@ -645,14 +645,14 @@ (let ([sp (open-output-string)]) (parameterize ([current-output-port sp] [current-traced-metafunctions 'all] - [print-as-quasiquote #f]) + [print-as-expression #f]) (term (f 1))) (test (get-output-string sp) ">(f 1)\n<0\n")) (let ([sp (open-output-string)]) (parameterize ([current-output-port sp] [current-traced-metafunctions '(f)] - [print-as-quasiquote #f]) + [print-as-expression #f]) (term (f 1))) (test (get-output-string sp) ">(f 1)\n<0\n"))) diff --git a/collects/scheme/runtime-config.rkt b/collects/scheme/runtime-config.rkt index f61c5daded..aef6106c2c 100644 --- a/collects/scheme/runtime-config.rkt +++ b/collects/scheme/runtime-config.rkt @@ -4,4 +4,4 @@ (define-values (configure) (lambda (config) - (print-as-quasiquote #f)))) + (print-as-expression #f)))) diff --git a/collects/scribble/eval.rkt b/collects/scribble/eval.rkt index a1b6dae813..e1ba5febae 100644 --- a/collects/scribble/eval.rkt +++ b/collects/scribble/eval.rkt @@ -124,7 +124,7 @@ (list (hspace 2) (elem #:style result-color - (to-element/no-color v #:qq? (print-as-quasiquote))))))))) + (to-element/no-color v #:qq? (print-as-expression))))))))) val-list)))) (loop (cdr expr-paras) (cdr val-list+outputs) @@ -320,7 +320,7 @@ (define (show-val v) (elem #:style result-color - (to-element/no-color v #:qq? (print-as-quasiquote)))) + (to-element/no-color v #:qq? (print-as-expression)))) (define (do-interaction-eval-show ev e) (parameterize ([current-command-line-arguments #()]) diff --git a/collects/scribblings/reference/printer.scrbl b/collects/scribblings/reference/printer.scrbl index f9b3313eb6..6a474c766d 100644 --- a/collects/scribblings/reference/printer.scrbl +++ b/collects/scribblings/reference/printer.scrbl @@ -11,7 +11,7 @@ using @scheme[read] on the output produces a value that is printing of strings, byte strings, characters, and symbols changes to render the character/byte content directly to the output port. The printer's @scheme[print] mode is similar to @scheme[write], but it is -sensitive to the @scheme[print-as-quasiquote] parameter for printing +sensitive to the @scheme[print-as-expression] parameter for printing values in a way that @scheme[read] plus @scheme[eval] on the output can be @scheme[equal?] to the printed value. @@ -68,7 +68,7 @@ characters. That is, the display form of a symbol is the same as the display form of @scheme[symbol->string] applied to the symbol. Symbols @scheme[print] the same as they @scheme[write], unless -@scheme[print-as-quasiquote] is set to @scheme[#t] and the current +@scheme[print-as-expression] is set to @scheme[#t] and the current @scheme[quasiquote] depth is @scheme[0]. In that case, the symbol's @scheme[print]ed form is prefixed with @litchar{'}. If the current @scheme[quasiquote] depth is @scheme[1], and if the symbol is @@ -146,9 +146,9 @@ including the tail as two elements of the enclosing list. The printed form of a pair is the same in both @scheme[write] and @scheme[display] modes, except as the printed form of the pair's @scheme[car] and @scheme[cdr] vary with the mode. The @scheme[print] -form is also the same is @scheme[print-as-quasiquote] is @scheme[#f]. +form is also the same is @scheme[print-as-expression] is @scheme[#f]. -When @scheme[print-as-quasiquote] is @scheme[#t] and the current +When @scheme[print-as-expression] is @scheme[#t] and the current @scheme[quasiquote] depth is @scheme[0], then the empty list prints as @litchar{'()} and a pair's output is prefixed with @litchar{`}; the pair's content is printed at @scheme[quasiquote] depth is @@ -211,7 +211,7 @@ decimal integer is printed after the @litchar{#}, and a repeated last element is printed only once. Vectors @scheme[print] the same as they @scheme[write], unless -@scheme[print-as-quasiquote] is set to @scheme[#t] and the current +@scheme[print-as-expression] is set to @scheme[#t] and the current @scheme[quasiquote] depth is @scheme[0]. In that case, the vector's @scheme[print]ed form is prefixed with @litchar{`}, and its content is printed with @scheme[quasiquote] depth @scheme[1]. @@ -230,7 +230,7 @@ for which the structure is an instance: structure type key, then the printed form each field in the structure, and then @litchar{)}. - In @scheme[print] mode when @scheme[print-as-quasiquote] is set + In @scheme[print] mode when @scheme[print-as-expression] is set to @scheme[#t] and the current @scheme[quasiquote] depth is @scheme[0], the structure's @scheme[print]ed form is prefixed with @litchar{`} and its content is printed with @@ -245,9 +245,9 @@ for which the structure is an instance: transparent, then the structure prints as the vector produced by @scheme[struct->vector] in @scheme[display] mode, in @scheme[write] mode, or in @scheme[print] mode when - @scheme[print-as-quasiquote] is set to @scheme[#f]. + @scheme[print-as-expression] is set to @scheme[#f]. - In @scheme[print] mode with @scheme[print-as-quasiquote] as + In @scheme[print] mode with @scheme[print-as-expression] as @scheme[#t], then the printed form is prefixed with as many @litchar{,}s as the current @scheme[quasiquote] depth. Instead of printing as a vector, the structure content is printed as a @@ -278,7 +278,7 @@ additional space if the key--value pair is not the last to be printed. After all key-value pairs, the printed form completes with @litchar{)}. -In @scheme[print] mode when @scheme[print-as-quasiquote] is +In @scheme[print] mode when @scheme[print-as-expression] is @scheme[#t] and the current quasiquote depth is @scheme[0], then the printed form is prefixed with @litchar{`} and the hash table's content is printed at @scheme[quasiquote] depth @scheme[1]. In the printed @@ -293,7 +293,7 @@ hash table prints (un@scheme[read]ably) as @litchar{#}. When the @scheme[print-box] parameter is set to @scheme[#t], a box prints as @litchar{#&} followed by the printed form of its content. -In @scheme[print] mode when @scheme[print-as-quasiquote] is +In @scheme[print] mode when @scheme[print-as-expression] is @scheme[#t] and the current quasiquote depth is @scheme[0], then the printed form is prefixed with @litchar{`} and the box's content is printed at @scheme[quasiquote] depth @scheme[1]. diff --git a/collects/scribblings/reference/write.scrbl b/collects/scribblings/reference/write.scrbl index 248429ecc0..5f126188d3 100644 --- a/collects/scribblings/reference/write.scrbl +++ b/collects/scribblings/reference/write.scrbl @@ -44,7 +44,7 @@ proportional to the depth of the value being printed, due to the initial cycle check.} @defproc[(print [datum any/c][out output-port? (current-output-port)] - [qq-depth exact-nonnegative-integer? 0]) + [quote-depth (or/c 0 1) 0]) void?]{ Writes @racket[datum] to @racket[out], normally the same way as @@ -53,10 +53,10 @@ Writes @racket[datum] to @racket[out], normally the same way as the handler specified by @racket[global-port-print-handler] is called; the default handler uses the default printer in @racket[write] mode. -The optional @racket[qq-depth] argument adjust printing when the -@racket[print-as-quasiquote] parameter is set to @racket[#t]. In that -case, @racket[qq-depth] specifies the starting @racket[quasiquote] -depth for printing @racket[datum]. +The optional @racket[quote-depth] argument adjusts printing when the +@racket[print-as-expression] parameter is set to @racket[#t]. In that +case, @racket[quote-depth] specifies the starting quote depth for +printing @racket[datum]. The rationale for providing @racket[print] is that @racket[display] and @racket[write] both have specific output conventions, and those @@ -209,7 +209,7 @@ with @racket[quote], @racket['quasiquote], @racket['unquote], @racket['unsyntax], or @racket['unsyntax-splicing]; defaults to @racket[#f]. See @secref["print-pairs"] for more information.} -@defboolparam[print-as-quasiquote on?]{ +@defboolparam[print-as-expression on?]{ A parameter that controls printing in @racket[print] mode (as opposed to @racket[write] or @racket[display]); defaults to @racket[#f]. See @@ -253,7 +253,7 @@ it is not @racket[#f], otherwise the path is left relative).} [proc (any/c output-port? . -> . any)]) void?])]{} -@defproc*[([(port-print-handler [out output-port?]) ((any/c output-port?) (exact-nonnegative-integer?) . ->* . any)] +@defproc*[([(port-print-handler [out output-port?]) ((any/c output-port?) ((or/c 0 1)) . ->* . any)] [(port-print-handler [out output-port?] [proc (any/c output-port? . -> . any)]) void?])]{ @@ -277,7 +277,7 @@ default print handler calls the global port print handler (the value of the @racket[global-port-print-handler] parameter); the default global port print handler is the same as the default write handler.} -@defproc*[([(global-port-print-handler) ((any/c output-port?) (exact-nonnegative-integer?) . ->* . any)] +@defproc*[([(global-port-print-handler) ((any/c output-port?) ((or/c 0 1)) . ->* . any)] [(global-port-print-handler [proc (any/c output-port? . -> . any)]) void?])]{ A parameter that determines @deftech{global port print handler}, diff --git a/collects/tests/racket/mz-tests.rktl b/collects/tests/racket/mz-tests.rktl index dc88c7b3fb..90a7fc0f6e 100644 --- a/collects/tests/racket/mz-tests.rktl +++ b/collects/tests/racket/mz-tests.rktl @@ -5,6 +5,7 @@ (load-relative "unicode.rktl") (load-relative "rx.rktl") (load-relative "read.rktl") +(load-relative "print.rktl") (load-relative "macro.rktl") (load-relative "syntax.rktl") (load-relative "procs.rktl") diff --git a/collects/tests/racket/pretty.rktl b/collects/tests/racket/pretty.rktl index 40f68d31df..2d772cd6d8 100644 --- a/collects/tests/racket/pretty.rktl +++ b/collects/tests/racket/pretty.rktl @@ -14,7 +14,7 @@ (require mzlib/pretty) -(print-as-quasiquote #f) +(print-as-expression #f) (define (pprec-print pprec port write?) (define (print-one n port) @@ -325,6 +325,6 @@ (test #t 'use-regression? use-regression?) -(print-as-quasiquote #t) +(print-as-expression #t) (report-errs) diff --git a/collects/tests/racket/print.rktl b/collects/tests/racket/print.rktl new file mode 100644 index 0000000000..bc96bba1f4 --- /dev/null +++ b/collects/tests/racket/print.rktl @@ -0,0 +1,162 @@ + +;; Test printing in as-expression mode + +(load-relative "loadtest.rktl") + +(Section 'printing) + +(let ([ptest (lambda (s v) + (define (to-string v) + (format "~v" v)) + (define (to-pretty-string v) + (pretty-format v)) + (test (regexp-replace* #rx"\n *" s " ") to-string v) + (test s to-pretty-string v))]) + (define-struct a (x y)) + (define-struct b (x y) #:transparent) + (define-struct c (x y) #:prefab) + (define (custom-printer get-xy) + (lambda (v port mode) + (define-values (d-x d-y) (get-xy)) + (define (recur v) + (case mode + [(#f) (display v port)] + [(#t) (write v port)] + [else (print v port mode)])) + (write-char #\< port) + (write mode port) + (write-char #\space port) + (recur (d-x v)) + (write-char #\space port) + (recur (d-y v)) + (write-char #\> port))) + (define-struct d (x y) + #:property prop:custom-write (custom-printer (lambda () (values d-x d-y)))) + (define-struct e (x y) + #:property prop:custom-write (custom-printer (lambda () (values e-x e-y))) + #:property prop:custom-print-as-constructor #t) + + (ptest "1" 1) + (ptest "1/2" 1/2) + (ptest "#f" #f) + (ptest "#\\x" #\x) + (ptest "'apple" 'apple) + (ptest "'|apple banana|" '|apple banana|) + (ptest "'#:apple" '#:apple) + (ptest "\"apple\"" "apple") + (ptest "#\"apple\"" #"apple") + (ptest "#rx\"apple\"" #rx"apple") + (ptest "#rx#\"apple\"" #rx#"apple") + (ptest "'()" '()) + (ptest "#" add1) + + (ptest "'#&1" (box 1)) + (ptest "'(1 . 2)" (cons 1 2)) + (ptest "'(1 2)" (list 1 2)) + (ptest "'(1 2 . 3)" (list* 1 2 3)) + (ptest "'#(1 2 3)" (vector 1 2 3)) + + (ptest "'#hash((1 . 2))" (hash 1 2)) + (ptest "'#hash((1 . 2))" (make-hash (list (cons 1 2)))) + (ptest "'#hasheq((1 . 2))" (hasheq 1 2)) + (ptest "'#hasheq((1 . 2))" (make-hasheq (list (cons 1 2)))) + (ptest "'#hasheqv((1 . 2))" (hasheqv 1 2)) + (ptest "'#hasheqv((1 . 2))" (make-hasheqv (list (cons 1 2)))) + + (ptest "(mcons 1 2)" (mcons 1 2)) + + (ptest "#" (a 1 2)) + (ptest "(b 1 2)" (b 1 2)) + (ptest "'#s(c 1 2)" (c 1 2)) + + (ptest "'<1 1 2>" (d 1 2)) + (ptest "'<1 1 #>" (d 1 (a 1 2))) + (ptest "<0 1 (b 1 2)>" (d 1 (b 1 2))) + + (ptest "'#&#" (box (a 1 2))) + (ptest "(box (b 1 2))" (box (b 1 2))) + (ptest "'#&#s(c 1 2)" (box (c 1 2))) + + (ptest "'(#)" (list (a 1 2))) + (ptest "(list (b 1 2))" (list (b 1 2))) + (ptest "'(#s(c 1 2))" (list (c 1 2))) + (ptest "'(<1 1 2>)" (list (d 1 2))) + (ptest "(list <0 1 2>)" (list (e 1 2))) + + (ptest "'(0 . #)" (cons 0 (a 1 2))) + (ptest "(cons 0 (b 1 2))" (cons 0 (b 1 2))) + (ptest "'(0 . #s(c 1 2))" (cons 0 (c 1 2))) + + (ptest "'#(#)" (vector (a 1 2))) + (ptest "(vector (b 1 2))" (vector (b 1 2))) + (ptest "'#(#s(c 1 2))" (vector (c 1 2))) + + (ptest "'#hash((0 . #))" (hash 0 (a 1 2))) + (ptest "(hash 0 (b 1 2))" (hash 0 (b 1 2))) + (ptest "'#hash((0 . #s(c 1 2)))" (hash 0 (c 1 2))) + + (ptest "(mcons 0 #)" (mcons 0 (a 1 2))) + (ptest "(mcons 0 (b 1 2))" (mcons 0 (b 1 2))) + (ptest "(mcons 0 '#s(c 1 2))" (mcons 0 (c 1 2))) + + (ptest "(list '(1 2) # (b 1 2))" (list '(1 2) (a 1 2) (b 1 2))) + (ptest "(list* '(1 2) # (b 1 2))" (list* '(1 2) (a 1 2) (b 1 2))) + (ptest "(vector '(1 2) # (b 1 2))" (vector '(1 2) (a 1 2) (b 1 2))) + (ptest "(hash '(1 2) (b 1 2))" (hash '(1 2) (b 1 2))) + + (ptest "'(#)" (list add1)) + (ptest "'#(#)" (vector add1)) + + (ptest "#0='(#0#)" (read (open-input-string "#0=(#0#)"))) + (ptest "#0='(#0# #0#)" (read (open-input-string "#0=(#0# #0#)"))) + (ptest "#0='(#0# . #0#)" (read (open-input-string "#0=(#0# . #0#)"))) + (ptest "#0='(#0# #0# . #0#)" (read (open-input-string "#0=(#0# #0# . #0#)"))) + (ptest "#0='#(#0# #0#)" (read (open-input-string "#0=#(#0# #0#)"))) + (ptest "#0='#�#" (read (open-input-string "#0=#�#"))) + (ptest "#0=(list (b 1 2) #0#)" (let ([v (make-placeholder #f)]) + (placeholder-set! v (list (b 1 2) v)) + (make-reader-graph v))) + (ptest "#0=(list* (b 1 2) 8 #0#)" (let ([v (make-placeholder #f)]) + (placeholder-set! v (list* (b 1 2) 8 v)) + (make-reader-graph v))) + (ptest "#0=(cons (b 1 2) #0#)" (let ([v (make-placeholder #f)]) + (placeholder-set! v (cons (b 1 2) v)) + (make-reader-graph v))) + (ptest "#0=(vector (b 1 2) #0#)" (let ([v (make-placeholder #f)]) + (placeholder-set! v (vector (b 1 2) v)) + (make-reader-graph v))) + (ptest "#0='#s(c 1 #0#)" (let ([v (make-placeholder #f)]) + (placeholder-set! v (c 1 v)) + (make-reader-graph v))) + (ptest "#0=(c (b 1 2) #0#)" (let ([v (make-placeholder #f)]) + (placeholder-set! v (c (b 1 2) v)) + (make-reader-graph v))) + + (ptest "'(apple\n \"0000000000000000000000000000000000000000000000000000000000000000000000\")" + (list 'apple (make-string 70 #\0))) + (ptest "'#(apple\n \"0000000000000000000000000000000000000000000000000000000000000000000000\")" + (vector 'apple (make-string 70 #\0))) + (ptest "'(apple\n .\n \"0000000000000000000000000000000000000000000000000000000000000000000000\")" + (cons 'apple (make-string 70 #\0))) + (ptest "'#hash((apple\n .\n \"0000000000000000000000000000000000000000000000000000000000000000000000\"))" + (hash 'apple (make-string 70 #\0))) + + (ptest "(list\n (b 1 2)\n \"00000000000000000000000000000000000000000000000000000000000000000\")" + (list (b 1 2) (make-string 65 #\0))) + (ptest "(cons\n (b 1 2)\n \"00000000000000000000000000000000000000000000000000000000000000000\")" + (cons (b 1 2) (make-string 65 #\0))) + (ptest "(vector\n (b 1 2)\n \"00000000000000000000000000000000000000000000000000000000000000000\")" + (vector (b 1 2) (make-string 65 #\0))) + (ptest "(mcons\n (b 1 2)\n \"00000000000000000000000000000000000000000000000000000000000000000\")" + (mcons (b 1 2) (make-string 65 #\0))) + (ptest "(hash\n (b 1 2)\n \"00000000000000000000000000000000000000000000000000000000000000000\")" + (hash (b 1 2) (make-string 65 #\0))) + (ptest "(box\n (b 1 \"00000000000000000000000000000000000000000000000000000000000000000000\"))" + (box (b 1 (make-string 68 #\0)))) + + (ptest "#0='(#0#\n \"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\"\n #0#)" + (read (open-input-string "#0=(#0# \"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\" #0#)"))) + + (void)) + +(report-errs) diff --git a/collects/tests/racket/struct.rktl b/collects/tests/racket/struct.rktl index 06ea1e0f48..df47bf79f0 100644 --- a/collects/tests/racket/struct.rktl +++ b/collects/tests/racket/struct.rktl @@ -840,13 +840,13 @@ (let ([t (make-tuple (list (box 1) 2 "a"))]) (set-box! (car (tuple-ref t 0)) t) (write t)))) - (test "ack: here: <10, 2, \"a\">" with-output-string + (test "ack: here: '<10, 2, \"a\">" with-output-string (lambda () (with-handlers ([exn:fail? (lambda (exn) (printf "~a" (exn-message exn)))]) (error 'ack "here: ~e" (make-tuple (list 10 2 "a")))))) - (test "ack: here: <100000..." with-output-string + (test "ack: here: '<10000..." with-output-string (lambda () (parameterize ([error-print-width 10]) (with-handlers ([exn:fail? (lambda (exn) diff --git a/collects/tests/racket/syntax.rktl b/collects/tests/racket/syntax.rktl index b6bb1c231f..4e187177d4 100644 --- a/collects/tests/racket/syntax.rktl +++ b/collects/tests/racket/syntax.rktl @@ -1103,7 +1103,7 @@ (test 3 'non-top (parameterize ([current-namespace ns]) (eval '(+ 1 2)))) - (test '`(+ 1 2) 'repl-top + (test ''(+ 1 2) 'repl-top (let ([s (open-output-bytes)]) (parameterize ([current-input-port (open-input-string "(+ 1 2)")] [current-namespace ns] diff --git a/src/racket/src/cstartup.inc b/src/racket/src/cstartup.inc index 8a029f775d..4d6f880a48 100644 --- a/src/racket/src/cstartup.inc +++ b/src/racket/src/cstartup.inc @@ -1,44 +1,44 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,50,51,0,0,0,1,0,0,10,0,13, -0,22,0,29,0,33,0,46,0,53,0,57,0,62,0,65,0,70,0,75,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,52,51,0,0,0,1,0,0,10,0,13, +0,22,0,27,0,32,0,45,0,52,0,57,0,61,0,65,0,72,0,79,0, 82,0,88,0,102,0,116,0,119,0,125,0,129,0,131,0,142,0,144,0,158, 0,165,0,187,0,189,0,203,0,14,1,43,1,54,1,65,1,75,1,111,1, 144,1,177,1,236,1,46,2,124,2,190,2,195,2,215,2,106,3,126,3,177, 3,243,3,128,4,14,5,66,5,89,5,168,5,0,0,109,7,0,0,69,35, -37,109,105,110,45,115,116,120,29,11,11,68,104,101,114,101,45,115,116,120,66, -108,101,116,114,101,99,63,108,101,116,72,112,97,114,97,109,101,116,101,114,105, -122,101,66,100,101,102,105,110,101,63,97,110,100,64,108,101,116,42,62,111,114, -64,119,104,101,110,64,99,111,110,100,66,117,110,108,101,115,115,65,113,117,111, +37,109,105,110,45,115,116,120,29,11,11,68,104,101,114,101,45,115,116,120,64, +108,101,116,42,64,99,111,110,100,72,112,97,114,97,109,101,116,101,114,105,122, +101,66,108,101,116,114,101,99,64,119,104,101,110,63,108,101,116,63,97,110,100, +66,117,110,108,101,115,115,66,100,101,102,105,110,101,62,111,114,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,122,11,62,105,102,65,98,101,103,105,110,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,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,97,36,11,8,240,225,78,0,0, -95,159,2,16,36,36,159,2,15,36,36,159,2,15,36,36,16,20,2,5,2, -2,2,6,2,2,2,7,2,2,2,8,2,2,2,10,2,2,2,9,2,2, -2,4,2,2,2,11,2,2,2,12,2,2,2,13,2,2,97,37,11,8,240, -225,78,0,0,93,159,2,15,36,37,16,2,2,3,161,2,2,37,2,3,2, -2,2,3,96,11,11,8,240,225,78,0,0,16,0,96,38,11,8,240,225,78, +101,102,105,110,101,45,118,97,108,117,101,115,97,36,11,8,240,249,80,0,0, +95,159,2,16,36,36,159,2,15,36,36,159,2,15,36,36,16,20,2,4,2, +2,2,11,2,2,2,5,2,2,2,12,2,2,2,7,2,2,2,8,2,2, +2,9,2,2,2,10,2,2,2,6,2,2,2,13,2,2,97,37,11,8,240, +249,80,0,0,93,159,2,15,36,37,16,2,2,3,161,2,2,37,2,3,2, +2,2,3,96,11,11,8,240,249,80,0,0,16,0,96,38,11,8,240,249,80, 0,0,16,0,13,16,4,36,29,11,11,2,2,11,18,16,2,99,64,104,101, -114,101,8,32,8,31,8,30,8,29,8,28,93,8,224,232,78,0,0,95,9, -8,224,232,78,0,0,2,2,27,248,22,147,4,195,249,22,140,4,80,158,39, +114,101,8,32,8,31,8,30,8,29,8,28,93,8,224,0,81,0,0,95,9, +8,224,0,81,0,0,2,2,27,248,22,147,4,195,249,22,140,4,80,158,39, 36,251,22,81,2,17,248,22,96,199,12,249,22,71,2,18,248,22,98,201,27, 248,22,147,4,195,249,22,140,4,80,158,39,36,251,22,81,2,17,248,22,96, 199,249,22,71,2,18,248,22,98,201,12,27,248,22,73,248,22,147,4,196,28, 248,22,79,193,20,15,159,37,36,37,28,248,22,79,248,22,73,194,248,22,72, 193,249,22,140,4,80,158,39,36,251,22,81,2,17,248,22,72,199,249,22,71, -2,8,248,22,73,201,11,18,16,2,101,10,8,32,8,31,8,30,8,29,8, -28,16,4,11,11,2,19,3,1,8,101,110,118,49,50,54,53,50,16,4,11, -11,2,20,3,1,8,101,110,118,49,50,54,53,51,93,8,224,233,78,0,0, -95,9,8,224,233,78,0,0,2,2,27,248,22,73,248,22,147,4,196,28,248, +2,10,248,22,73,201,11,18,16,2,101,10,8,32,8,31,8,30,8,29,8, +28,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,52,54,16,4,11, +11,2,20,3,1,8,101,110,118,49,50,55,52,55,93,8,224,1,81,0,0, +95,9,8,224,1,81,0,0,2,2,27,248,22,73,248,22,147,4,196,28,248, 22,79,193,20,15,159,37,36,37,28,248,22,79,248,22,73,194,248,22,72,193, 249,22,140,4,80,158,39,36,250,22,81,2,21,248,22,81,249,22,81,248,22, -81,2,22,248,22,72,201,251,22,81,2,17,2,22,2,22,249,22,71,2,10, +81,2,22,248,22,72,201,251,22,81,2,17,2,22,2,22,249,22,71,2,13, 248,22,73,204,18,16,2,101,11,8,32,8,31,8,30,8,29,8,28,16,4, -11,11,2,19,3,1,8,101,110,118,49,50,54,53,53,16,4,11,11,2,20, -3,1,8,101,110,118,49,50,54,53,54,93,8,224,234,78,0,0,95,9,8, -224,234,78,0,0,2,2,248,22,147,4,193,27,248,22,147,4,194,249,22,71, +11,11,2,19,3,1,8,101,110,118,49,50,55,52,57,16,4,11,11,2,20, +3,1,8,101,110,118,49,50,55,53,48,93,8,224,2,81,0,0,95,9,8, +224,2,81,0,0,2,2,248,22,147,4,193,27,248,22,147,4,194,249,22,71, 248,22,81,248,22,72,196,248,22,73,195,27,248,22,73,248,22,147,4,23,197, 1,249,22,140,4,80,158,39,36,28,248,22,56,248,22,141,4,248,22,72,23, 198,2,27,249,22,2,32,0,89,162,8,44,37,43,9,222,33,40,248,22,147, @@ -52,7 +52,7 @@ 44,37,47,9,222,33,43,248,22,147,4,248,22,72,201,248,22,73,198,27,248, 22,73,248,22,147,4,196,27,248,22,147,4,248,22,72,195,249,22,140,4,80, 158,40,36,28,248,22,79,195,250,22,82,2,21,9,248,22,73,199,250,22,81, -2,5,248,22,81,248,22,72,199,250,22,82,2,9,248,22,73,201,248,22,73, +2,9,248,22,81,248,22,72,199,250,22,82,2,4,248,22,73,201,248,22,73, 202,27,248,22,73,248,22,147,4,23,197,1,27,249,22,1,22,85,249,22,2, 22,147,4,248,22,147,4,248,22,72,199,249,22,140,4,80,158,40,36,251,22, 81,1,22,119,105,116,104,45,99,111,110,116,105,110,117,97,116,105,111,110,45, @@ -63,13 +63,13 @@ 22,147,4,196,28,248,22,79,193,20,15,159,37,36,37,249,22,140,4,80,158, 39,36,27,248,22,147,4,248,22,72,197,28,249,22,181,8,62,61,62,248,22, 141,4,248,22,96,196,250,22,81,2,21,248,22,81,249,22,81,21,93,2,26, -248,22,72,199,250,22,82,2,12,249,22,81,2,26,249,22,81,248,22,105,203, +248,22,72,199,250,22,82,2,5,249,22,81,2,26,249,22,81,248,22,105,203, 2,26,248,22,73,202,251,22,81,2,17,28,249,22,181,8,248,22,141,4,248, 22,72,200,64,101,108,115,101,10,248,22,72,197,250,22,82,2,21,9,248,22, -73,200,249,22,71,2,12,248,22,73,202,100,8,32,8,31,8,30,8,29,8, -28,16,4,11,11,2,19,3,1,8,101,110,118,49,50,54,55,56,16,4,11, -11,2,20,3,1,8,101,110,118,49,50,54,55,57,93,8,224,235,78,0,0, -18,16,2,158,94,10,64,118,111,105,100,8,48,95,9,8,224,235,78,0,0, +73,200,249,22,71,2,5,248,22,73,202,100,8,32,8,31,8,30,8,29,8, +28,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,55,50,16,4,11, +11,2,20,3,1,8,101,110,118,49,50,55,55,51,93,8,224,3,81,0,0, +18,16,2,158,94,10,64,118,111,105,100,8,48,95,9,8,224,3,81,0,0, 2,2,27,248,22,73,248,22,147,4,196,249,22,140,4,80,158,39,36,28,248, 22,56,248,22,141,4,248,22,72,197,250,22,81,2,27,248,22,81,248,22,72, 199,248,22,96,198,27,248,22,141,4,248,22,72,197,250,22,81,2,27,248,22, @@ -81,25 +81,25 @@ 11,11,11,11,11,16,10,2,4,2,5,2,6,2,7,2,8,2,9,2,10, 2,11,2,12,2,13,36,46,37,11,11,11,16,0,16,0,16,0,36,36,11, 11,11,11,16,0,16,0,16,0,36,36,16,11,16,5,2,3,20,15,159,36, -36,36,36,20,105,159,36,16,0,16,1,33,33,10,16,5,2,13,89,162,8, +36,36,36,20,105,159,36,16,0,16,1,33,33,10,16,5,2,11,89,162,8, 44,37,53,9,223,0,33,34,36,20,105,159,36,16,1,2,3,16,0,11,16, -5,2,11,89,162,8,44,37,53,9,223,0,33,35,36,20,105,159,36,16,1, -2,3,16,0,11,16,5,2,8,89,162,8,44,37,53,9,223,0,33,36,36, -20,105,159,36,16,1,2,3,16,1,33,37,11,16,5,2,10,89,162,8,44, +5,2,8,89,162,8,44,37,53,9,223,0,33,35,36,20,105,159,36,16,1, +2,3,16,0,11,16,5,2,10,89,162,8,44,37,53,9,223,0,33,36,36, +20,105,159,36,16,1,2,3,16,1,33,37,11,16,5,2,13,89,162,8,44, 37,56,9,223,0,33,38,36,20,105,159,36,16,1,2,3,16,1,33,39,11, -16,5,2,5,89,162,8,44,37,58,9,223,0,33,42,36,20,105,159,36,16, -1,2,3,16,0,11,16,5,2,4,89,162,8,44,37,53,9,223,0,33,44, -36,20,105,159,36,16,1,2,3,16,0,11,16,5,2,9,89,162,8,44,37, +16,5,2,9,89,162,8,44,37,58,9,223,0,33,42,36,20,105,159,36,16, +1,2,3,16,0,11,16,5,2,7,89,162,8,44,37,53,9,223,0,33,44, +36,20,105,159,36,16,1,2,3,16,0,11,16,5,2,4,89,162,8,44,37, 54,9,223,0,33,45,36,20,105,159,36,16,1,2,3,16,0,11,16,5,2, 6,89,162,8,44,37,55,9,223,0,33,46,36,20,105,159,36,16,1,2,3, -16,0,11,16,5,2,12,89,162,8,44,37,58,9,223,0,33,47,36,20,105, -159,36,16,1,2,3,16,1,33,49,11,16,5,2,7,89,162,8,44,37,54, +16,0,11,16,5,2,5,89,162,8,44,37,58,9,223,0,33,47,36,20,105, +159,36,16,1,2,3,16,1,33,49,11,16,5,2,12,89,162,8,44,37,54, 9,223,0,33,50,36,20,105,159,36,16,1,2,3,16,0,11,16,0,94,2, 15,2,16,93,2,15,9,9,36,0}; EVAL_ONE_SIZED_STR((char *)expr, 2025); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,50,65,0,0,0,1,0,0,8,0,21, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,52,65,0,0,0,1,0,0,8,0,21, 0,26,0,43,0,58,0,76,0,92,0,102,0,120,0,140,0,156,0,174,0, 205,0,234,0,0,1,14,1,20,1,34,1,39,1,49,1,57,1,85,1,117, 1,123,1,168,1,213,1,237,1,20,2,22,2,188,2,22,4,63,4,136,5, @@ -132,231 +132,231 @@ 32,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,114,111,111,116,32,112,97,116,104,58,32,5,0,27,20,14,159,80,159,37, -51,38,250,80,159,40,52,38,249,22,27,11,80,159,42,51,38,22,150,13,10, +51,38,250,80,159,40,52,38,249,22,27,11,80,159,42,51,38,22,153,13,10, 248,22,173,5,23,196,2,28,248,22,170,6,23,194,2,12,87,94,248,22,187, 8,23,194,1,27,20,14,159,80,159,38,51,38,250,80,159,41,52,38,249,22, -27,11,80,159,43,51,38,22,150,13,10,248,22,173,5,23,197,2,28,248,22, +27,11,80,159,43,51,38,22,153,13,10,248,22,173,5,23,197,2,28,248,22, 170,6,23,194,2,12,87,94,248,22,187,8,23,194,1,27,20,14,159,80,159, -39,51,38,250,80,159,42,52,38,249,22,27,11,80,159,44,51,38,22,150,13, +39,51,38,250,80,159,42,52,38,249,22,27,11,80,159,44,51,38,22,153,13, 10,248,22,173,5,23,198,2,28,248,22,170,6,23,194,2,12,87,94,248,22, 187,8,23,194,1,248,80,159,40,54,37,197,28,248,22,79,23,195,2,9,27, -248,22,72,23,196,2,27,28,248,22,134,14,23,195,2,23,194,1,28,248,22, -133,14,23,195,2,249,22,135,14,23,196,1,250,80,158,43,49,248,22,150,14, -2,20,11,10,250,80,158,41,49,248,22,150,14,2,20,23,197,1,10,28,23, -193,2,249,22,71,248,22,137,14,249,22,135,14,23,198,1,247,22,151,14,27, +248,22,72,23,196,2,27,28,248,22,137,14,23,195,2,23,194,1,28,248,22, +136,14,23,195,2,249,22,138,14,23,196,1,250,80,158,43,49,248,22,153,14, +2,20,11,10,250,80,158,41,49,248,22,153,14,2,20,23,197,1,10,28,23, +193,2,249,22,71,248,22,140,14,249,22,138,14,23,198,1,247,22,154,14,27, 248,22,73,23,200,1,28,248,22,79,23,194,2,9,27,248,22,72,23,195,2, -27,28,248,22,134,14,23,195,2,23,194,1,28,248,22,133,14,23,195,2,249, -22,135,14,23,196,1,250,80,158,48,49,248,22,150,14,2,20,11,10,250,80, -158,46,49,248,22,150,14,2,20,23,197,1,10,28,23,193,2,249,22,71,248, -22,137,14,249,22,135,14,23,198,1,247,22,151,14,248,80,159,46,53,37,248, +27,28,248,22,137,14,23,195,2,23,194,1,28,248,22,136,14,23,195,2,249, +22,138,14,23,196,1,250,80,158,48,49,248,22,153,14,2,20,11,10,250,80, +158,46,49,248,22,153,14,2,20,23,197,1,10,28,23,193,2,249,22,71,248, +22,140,14,249,22,138,14,23,198,1,247,22,154,14,248,80,159,46,53,37,248, 22,73,23,199,1,87,94,23,193,1,248,80,159,44,53,37,248,22,73,23,197, 1,87,94,23,193,1,27,248,22,73,23,198,1,28,248,22,79,23,194,2,9, -27,248,22,72,23,195,2,27,28,248,22,134,14,23,195,2,23,194,1,28,248, -22,133,14,23,195,2,249,22,135,14,23,196,1,250,80,158,46,49,248,22,150, -14,2,20,11,10,250,80,158,44,49,248,22,150,14,2,20,23,197,1,10,28, -23,193,2,249,22,71,248,22,137,14,249,22,135,14,23,198,1,247,22,151,14, +27,248,22,72,23,195,2,27,28,248,22,137,14,23,195,2,23,194,1,28,248, +22,136,14,23,195,2,249,22,138,14,23,196,1,250,80,158,46,49,248,22,153, +14,2,20,11,10,250,80,158,44,49,248,22,153,14,2,20,23,197,1,10,28, +23,193,2,249,22,71,248,22,140,14,249,22,138,14,23,198,1,247,22,154,14, 248,80,159,44,53,37,248,22,73,23,199,1,248,80,159,42,53,37,248,22,73, -196,27,248,22,174,13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248, -22,175,6,23,195,2,27,248,22,132,14,195,28,192,192,248,22,133,14,195,11, -87,94,28,28,248,22,175,13,23,195,2,10,28,248,22,174,13,23,195,2,10, -28,248,22,175,6,23,195,2,28,248,22,132,14,23,195,2,10,248,22,133,14, +196,27,248,22,177,13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248, +22,175,6,23,195,2,27,248,22,135,14,195,28,192,192,248,22,136,14,195,11, +87,94,28,28,248,22,178,13,23,195,2,10,28,248,22,177,13,23,195,2,10, +28,248,22,175,6,23,195,2,28,248,22,135,14,23,195,2,10,248,22,136,14, 23,195,2,11,12,250,22,151,9,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,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,175,13,23,195,2,249, -22,181,8,248,22,176,13,23,197,2,2,21,249,22,181,8,247,22,130,8,2, -21,27,28,248,22,175,6,23,196,2,23,195,2,248,22,184,7,248,22,179,13, -23,197,2,28,249,22,165,14,0,21,35,114,120,34,94,91,92,92,93,91,92, +104,32,115,116,114,105,110,103,23,197,2,28,28,248,22,178,13,23,195,2,249, +22,181,8,248,22,179,13,23,197,2,2,21,249,22,181,8,247,22,130,8,2, +21,27,28,248,22,175,6,23,196,2,23,195,2,248,22,184,7,248,22,182,13, +23,197,2,28,249,22,168,14,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,175,6,195,248,22, -182,13,195,194,27,248,22,150,7,23,195,1,249,22,183,13,248,22,187,7,250, -22,173,14,0,6,35,114,120,34,47,34,28,249,22,165,14,0,22,35,114,120, +185,13,195,194,27,248,22,150,7,23,195,1,249,22,186,13,248,22,187,7,250, +22,176,14,0,6,35,114,120,34,47,34,28,249,22,168,14,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,173,14,0,19,35,114,120,34,91,32,46,93,43,40,91, +2,23,199,1,250,22,176,14,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,159,44,37,38, -2,21,28,248,22,175,6,194,248,22,182,13,194,193,87,94,28,28,248,22,174, -13,23,195,2,10,28,248,22,175,6,23,195,2,28,248,22,132,14,23,195,2, -10,248,22,133,14,23,195,2,11,12,250,22,151,9,23,196,2,2,22,23,197, -2,28,248,22,132,14,23,195,2,12,248,22,190,11,249,22,132,11,248,22,140, +2,21,28,248,22,175,6,194,248,22,185,13,194,193,87,94,28,28,248,22,177, +13,23,195,2,10,28,248,22,175,6,23,195,2,28,248,22,135,14,23,195,2, +10,248,22,136,14,23,195,2,11,12,250,22,151,9,23,196,2,2,22,23,197, +2,28,248,22,135,14,23,195,2,12,248,22,129,12,249,22,135,11,248,22,140, 7,250,22,159,7,2,23,23,200,1,23,201,1,247,22,23,87,94,28,28,248, -22,174,13,23,195,2,10,28,248,22,175,6,23,195,2,28,248,22,132,14,23, -195,2,10,248,22,133,14,23,195,2,11,12,250,22,151,9,23,196,2,2,22, -23,197,2,28,248,22,132,14,23,195,2,12,248,22,190,11,249,22,132,11,248, +22,177,13,23,195,2,10,28,248,22,175,6,23,195,2,28,248,22,135,14,23, +195,2,10,248,22,136,14,23,195,2,11,12,250,22,151,9,23,196,2,2,22, +23,197,2,28,248,22,135,14,23,195,2,12,248,22,129,12,249,22,135,11,248, 22,140,7,250,22,159,7,2,23,23,200,1,23,201,1,247,22,23,87,94,87, -94,28,28,248,22,174,13,23,195,2,10,28,248,22,175,6,23,195,2,28,248, -22,132,14,23,195,2,10,248,22,133,14,23,195,2,11,12,250,22,151,9,195, -2,22,23,197,2,28,248,22,132,14,23,195,2,12,248,22,190,11,249,22,132, +94,28,28,248,22,177,13,23,195,2,10,28,248,22,175,6,23,195,2,28,248, +22,135,14,23,195,2,10,248,22,136,14,23,195,2,11,12,250,22,151,9,195, +2,22,23,197,2,28,248,22,135,14,23,195,2,12,248,22,129,12,249,22,135, 11,248,22,140,7,250,22,159,7,2,23,199,23,201,1,247,22,23,249,22,3, -89,162,8,44,37,50,9,223,2,33,35,196,87,94,28,28,248,22,174,13,23, -194,2,10,28,248,22,175,6,23,194,2,28,248,22,132,14,23,194,2,10,248, -22,133,14,23,194,2,11,12,250,22,151,9,2,7,2,22,23,196,2,28,248, -22,132,14,23,194,2,12,248,22,190,11,249,22,132,11,248,22,140,7,250,22, +89,162,8,44,37,50,9,223,2,33,35,196,87,94,28,28,248,22,177,13,23, +194,2,10,28,248,22,175,6,23,194,2,28,248,22,135,14,23,194,2,10,248, +22,136,14,23,194,2,11,12,250,22,151,9,2,7,2,22,23,196,2,28,248, +22,135,14,23,194,2,12,248,22,129,12,249,22,135,11,248,22,140,7,250,22, 159,7,2,23,2,7,23,200,1,247,22,23,32,38,89,162,8,44,40,55,2, -24,222,33,39,28,248,22,79,23,197,2,87,94,23,196,1,248,22,190,11,249, -22,165,11,251,22,159,7,2,25,2,7,28,248,22,79,23,203,2,87,94,23, -202,1,23,201,1,250,22,1,22,128,14,23,204,1,23,205,1,23,200,1,247, -22,23,27,249,22,128,14,248,22,72,23,200,2,23,197,2,28,248,22,187,13, -23,194,2,27,250,22,1,22,128,14,23,197,1,199,28,248,22,187,13,193,192, +24,222,33,39,28,248,22,79,23,197,2,87,94,23,196,1,248,22,129,12,249, +22,168,11,251,22,159,7,2,25,2,7,28,248,22,79,23,203,2,87,94,23, +202,1,23,201,1,250,22,1,22,131,14,23,204,1,23,205,1,23,200,1,247, +22,23,27,249,22,131,14,248,22,72,23,200,2,23,197,2,28,248,22,190,13, +23,194,2,27,250,22,1,22,131,14,23,197,1,199,28,248,22,190,13,193,192, 251,2,38,198,199,200,248,22,73,202,251,2,38,197,198,199,248,22,73,201,87, -94,87,94,87,94,28,28,248,22,174,13,193,10,28,248,22,175,6,193,28,248, -22,132,14,193,10,248,22,133,14,193,11,12,250,22,151,9,2,7,2,22,195, -28,248,22,132,14,193,12,248,22,190,11,249,22,132,11,248,22,140,7,250,22, +94,87,94,87,94,28,28,248,22,177,13,193,10,28,248,22,175,6,193,28,248, +22,135,14,193,10,248,22,136,14,193,11,12,250,22,151,9,2,7,2,22,195, +28,248,22,135,14,193,12,248,22,129,12,249,22,135,11,248,22,140,7,250,22, 159,7,2,23,2,7,199,247,22,23,249,22,3,32,0,89,162,8,44,37,49, -9,222,33,37,195,27,247,22,152,14,251,2,38,196,197,198,196,32,41,89,162, +9,222,33,37,195,27,247,22,155,14,251,2,38,196,197,198,196,32,41,89,162, 44,42,59,2,24,222,33,42,28,248,22,79,23,199,2,87,94,23,198,1,248, 23,196,1,251,22,159,7,2,25,23,199,1,28,248,22,79,23,203,2,87,94, -23,202,1,23,201,1,250,22,1,22,128,14,23,204,1,23,205,1,23,198,1, -27,249,22,128,14,248,22,72,23,202,2,23,199,2,28,248,22,187,13,23,194, -2,27,250,22,1,22,128,14,23,197,1,23,202,2,28,248,22,187,13,23,194, +23,202,1,23,201,1,250,22,1,22,131,14,23,204,1,23,205,1,23,198,1, +27,249,22,131,14,248,22,72,23,202,2,23,199,2,28,248,22,190,13,23,194, +2,27,250,22,1,22,131,14,23,197,1,23,202,2,28,248,22,190,13,23,194, 2,192,87,94,23,193,1,27,248,22,73,23,202,1,28,248,22,79,23,194,2, 87,94,23,193,1,248,23,199,1,251,22,159,7,2,25,23,202,1,28,248,22, -79,23,206,2,87,94,23,205,1,23,204,1,250,22,1,22,128,14,23,207,1, -23,208,1,23,201,1,27,249,22,128,14,248,22,72,23,197,2,23,202,2,28, -248,22,187,13,23,194,2,27,250,22,1,22,128,14,23,197,1,204,28,248,22, -187,13,193,192,253,2,41,203,204,205,206,23,15,248,22,73,201,253,2,41,202, +79,23,206,2,87,94,23,205,1,23,204,1,250,22,1,22,131,14,23,207,1, +23,208,1,23,201,1,27,249,22,131,14,248,22,72,23,197,2,23,202,2,28, +248,22,190,13,23,194,2,27,250,22,1,22,131,14,23,197,1,204,28,248,22, +190,13,193,192,253,2,41,203,204,205,206,23,15,248,22,73,201,253,2,41,202, 203,204,205,206,248,22,73,200,87,94,23,193,1,27,248,22,73,23,201,1,28, 248,22,79,23,194,2,87,94,23,193,1,248,23,198,1,251,22,159,7,2,25, 23,201,1,28,248,22,79,23,205,2,87,94,23,204,1,23,203,1,250,22,1, -22,128,14,23,206,1,23,207,1,23,200,1,27,249,22,128,14,248,22,72,23, -197,2,23,201,2,28,248,22,187,13,23,194,2,27,250,22,1,22,128,14,23, -197,1,203,28,248,22,187,13,193,192,253,2,41,202,203,204,205,206,248,22,73, -201,253,2,41,201,202,203,204,205,248,22,73,200,27,247,22,152,14,253,2,41, -198,199,200,201,202,198,87,95,28,28,248,22,175,13,23,194,2,10,28,248,22, -174,13,23,194,2,10,28,248,22,175,6,23,194,2,28,248,22,132,14,23,194, -2,10,248,22,133,14,23,194,2,11,12,252,22,151,9,23,200,2,2,26,36, +22,131,14,23,206,1,23,207,1,23,200,1,27,249,22,131,14,248,22,72,23, +197,2,23,201,2,28,248,22,190,13,23,194,2,27,250,22,1,22,131,14,23, +197,1,203,28,248,22,190,13,193,192,253,2,41,202,203,204,205,206,248,22,73, +201,253,2,41,201,202,203,204,205,248,22,73,200,27,247,22,155,14,253,2,41, +198,199,200,201,202,198,87,95,28,28,248,22,178,13,23,194,2,10,28,248,22, +177,13,23,194,2,10,28,248,22,175,6,23,194,2,28,248,22,135,14,23,194, +2,10,248,22,136,14,23,194,2,11,12,252,22,151,9,23,200,2,2,26,36, 23,198,2,23,199,2,28,28,248,22,175,6,23,195,2,10,248,22,163,7,23, 195,2,87,94,23,194,1,12,252,22,151,9,23,200,2,2,27,37,23,198,2, -23,199,1,91,159,39,11,90,161,39,36,11,248,22,131,14,23,197,2,87,94, +23,199,1,91,159,39,11,90,161,39,36,11,248,22,134,14,23,197,2,87,94, 23,195,1,87,94,28,192,12,250,22,152,9,23,201,1,2,28,23,199,1,249, -22,7,194,195,91,159,38,11,90,161,38,36,11,87,95,28,28,248,22,175,13, -23,196,2,10,28,248,22,174,13,23,196,2,10,28,248,22,175,6,23,196,2, -28,248,22,132,14,23,196,2,10,248,22,133,14,23,196,2,11,12,252,22,151, +22,7,194,195,91,159,38,11,90,161,38,36,11,87,95,28,28,248,22,178,13, +23,196,2,10,28,248,22,177,13,23,196,2,10,28,248,22,175,6,23,196,2, +28,248,22,135,14,23,196,2,10,248,22,136,14,23,196,2,11,12,252,22,151, 9,2,10,2,26,36,23,200,2,23,201,2,28,28,248,22,175,6,23,197,2, 10,248,22,163,7,23,197,2,12,252,22,151,9,2,10,2,27,37,23,200,2, -23,201,2,91,159,39,11,90,161,39,36,11,248,22,131,14,23,199,2,87,94, +23,201,2,91,159,39,11,90,161,39,36,11,248,22,134,14,23,199,2,87,94, 23,195,1,87,94,28,192,12,250,22,152,9,2,10,2,28,23,201,2,249,22, -7,194,195,27,249,22,184,13,250,22,172,14,0,20,35,114,120,35,34,40,63, -58,91,46,93,91,94,46,93,42,124,41,36,34,248,22,180,13,23,201,1,28, +7,194,195,27,249,22,187,13,250,22,175,14,0,20,35,114,120,35,34,40,63, +58,91,46,93,91,94,46,93,42,124,41,36,34,248,22,183,13,23,201,1,28, 248,22,175,6,23,203,2,249,22,187,7,23,204,1,8,63,23,202,1,28,248, -22,175,13,23,199,2,248,22,176,13,23,199,1,87,94,23,198,1,247,22,177, -13,28,248,22,174,13,194,249,22,128,14,195,194,192,91,159,38,11,90,161,38, -36,11,87,95,28,28,248,22,175,13,23,196,2,10,28,248,22,174,13,23,196, -2,10,28,248,22,175,6,23,196,2,28,248,22,132,14,23,196,2,10,248,22, -133,14,23,196,2,11,12,252,22,151,9,2,11,2,26,36,23,200,2,23,201, +22,178,13,23,199,2,248,22,179,13,23,199,1,87,94,23,198,1,247,22,180, +13,28,248,22,177,13,194,249,22,131,14,195,194,192,91,159,38,11,90,161,38, +36,11,87,95,28,28,248,22,178,13,23,196,2,10,28,248,22,177,13,23,196, +2,10,28,248,22,175,6,23,196,2,28,248,22,135,14,23,196,2,10,248,22, +136,14,23,196,2,11,12,252,22,151,9,2,11,2,26,36,23,200,2,23,201, 2,28,28,248,22,175,6,23,197,2,10,248,22,163,7,23,197,2,12,252,22, 151,9,2,11,2,27,37,23,200,2,23,201,2,91,159,39,11,90,161,39,36, -11,248,22,131,14,23,199,2,87,94,23,195,1,87,94,28,192,12,250,22,152, -9,2,11,2,28,23,201,2,249,22,7,194,195,27,249,22,184,13,249,22,173, -7,250,22,173,14,0,9,35,114,120,35,34,91,46,93,34,248,22,180,13,23, +11,248,22,134,14,23,199,2,87,94,23,195,1,87,94,28,192,12,250,22,152, +9,2,11,2,28,23,201,2,249,22,7,194,195,27,249,22,187,13,249,22,173, +7,250,22,176,14,0,9,35,114,120,35,34,91,46,93,34,248,22,183,13,23, 203,1,6,1,1,95,28,248,22,175,6,23,202,2,249,22,187,7,23,203,1, -8,63,23,201,1,28,248,22,175,13,23,199,2,248,22,176,13,23,199,1,87, -94,23,198,1,247,22,177,13,28,248,22,174,13,194,249,22,128,14,195,194,192, +8,63,23,201,1,28,248,22,178,13,23,199,2,248,22,179,13,23,199,1,87, +94,23,198,1,247,22,180,13,28,248,22,177,13,194,249,22,131,14,195,194,192, 249,247,22,142,5,194,11,249,80,159,38,47,37,9,9,249,80,159,38,47,37, -195,9,27,247,22,154,14,249,80,158,39,48,28,23,195,2,27,248,22,128,8, +195,9,27,247,22,157,14,249,80,158,39,48,28,23,195,2,27,248,22,128,8, 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,128,14,248,22,150,14,69,97,100,100,111,110, +0,0,27,28,23,196,1,250,22,131,14,248,22,153,14,69,97,100,100,111,110, 45,100,105,114,247,22,190,7,6,8,8,99,111,108,108,101,99,116,115,11,27, -248,80,159,42,53,37,250,22,85,23,203,1,248,22,81,248,22,150,14,72,99, +248,80,159,42,53,37,250,22,85,23,203,1,248,22,81,248,22,153,14,72,99, 111,108,108,101,99,116,115,45,100,105,114,23,204,1,28,193,249,22,71,195,194, -192,32,51,89,162,8,44,39,8,31,2,19,222,33,52,27,249,22,161,14,23, +192,32,51,89,162,8,44,39,8,31,2,19,222,33,52,27,249,22,164,14,23, 197,2,23,198,2,28,23,193,2,87,94,23,196,1,27,248,22,96,23,195,2, -27,27,248,22,105,23,197,1,27,249,22,161,14,23,201,2,23,196,2,28,23, +27,27,248,22,105,23,197,1,27,249,22,164,14,23,201,2,23,196,2,28,23, 193,2,87,94,23,194,1,27,248,22,96,23,195,2,27,27,248,22,105,23,197, -1,27,249,22,161,14,23,205,2,23,196,2,28,23,193,2,87,94,23,194,1, -27,248,22,96,23,195,2,27,27,248,22,105,23,197,1,27,249,22,161,14,23, +1,27,249,22,164,14,23,205,2,23,196,2,28,23,193,2,87,94,23,194,1, +27,248,22,96,23,195,2,27,27,248,22,105,23,197,1,27,249,22,164,14,23, 209,2,23,196,2,28,23,193,2,87,94,23,194,1,27,248,22,96,23,195,2, -27,27,248,22,105,23,197,1,27,249,22,161,14,23,213,2,23,196,2,28,23, +27,27,248,22,105,23,197,1,27,249,22,164,14,23,213,2,23,196,2,28,23, 193,2,87,94,23,194,1,27,248,22,96,23,195,2,27,250,2,51,23,215,2, 23,216,1,248,22,105,23,199,1,28,249,22,169,7,23,196,2,2,29,249,22, -85,23,214,2,194,249,22,71,248,22,183,13,23,197,1,194,87,95,23,211,1, +85,23,214,2,194,249,22,71,248,22,186,13,23,197,1,194,87,95,23,211,1, 23,193,1,28,249,22,169,7,23,196,2,2,29,249,22,85,23,212,2,9,249, -22,71,248,22,183,13,23,197,1,9,28,249,22,169,7,23,196,2,2,29,249, -22,85,23,210,2,194,249,22,71,248,22,183,13,23,197,1,194,87,94,23,193, +22,71,248,22,186,13,23,197,1,9,28,249,22,169,7,23,196,2,2,29,249, +22,85,23,210,2,194,249,22,71,248,22,186,13,23,197,1,194,87,94,23,193, 1,28,249,22,169,7,23,196,2,2,29,249,22,85,23,208,2,9,249,22,71, -248,22,183,13,23,197,1,9,28,249,22,169,7,23,196,2,2,29,249,22,85, -23,206,2,194,249,22,71,248,22,183,13,23,197,1,194,87,94,23,193,1,28, +248,22,186,13,23,197,1,9,28,249,22,169,7,23,196,2,2,29,249,22,85, +23,206,2,194,249,22,71,248,22,186,13,23,197,1,194,87,94,23,193,1,28, 249,22,169,7,23,196,2,2,29,249,22,85,23,204,2,9,249,22,71,248,22, -183,13,23,197,1,9,28,249,22,169,7,23,196,2,2,29,249,22,85,23,202, -2,194,249,22,71,248,22,183,13,23,197,1,194,87,94,23,193,1,28,249,22, -169,7,23,196,2,2,29,249,22,85,23,200,2,9,249,22,71,248,22,183,13, +186,13,23,197,1,9,28,249,22,169,7,23,196,2,2,29,249,22,85,23,202, +2,194,249,22,71,248,22,186,13,23,197,1,194,87,94,23,193,1,28,249,22, +169,7,23,196,2,2,29,249,22,85,23,200,2,9,249,22,71,248,22,186,13, 23,197,1,9,28,249,22,169,7,23,196,2,2,29,249,22,85,197,194,87,94, -23,196,1,249,22,71,248,22,183,13,23,197,1,194,87,94,23,193,1,28,249, +23,196,1,249,22,71,248,22,186,13,23,197,1,194,87,94,23,193,1,28,249, 22,169,7,23,198,2,2,29,249,22,85,195,9,87,94,23,194,1,249,22,71, -248,22,183,13,23,199,1,9,87,95,28,28,248,22,163,7,194,10,248,22,175, +248,22,186,13,23,199,1,9,87,95,28,28,248,22,163,7,194,10,248,22,175, 6,194,12,250,22,151,9,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,80,195,249,22, -4,22,174,13,196,11,12,250,22,151,9,2,14,6,13,13,108,105,115,116,32, +4,22,177,13,196,11,12,250,22,151,9,2,14,6,13,13,108,105,115,116,32, 111,102,32,112,97,116,104,115,197,250,2,51,197,195,28,248,22,175,6,197,248, 22,186,7,197,196,32,54,89,162,8,44,39,53,70,102,111,117,110,100,45,101, 120,101,99,222,33,57,32,55,89,162,8,44,40,58,64,110,101,120,116,222,33, -56,27,248,22,136,14,23,196,2,28,249,22,183,8,23,195,2,23,197,1,11, -28,248,22,132,14,23,194,2,27,249,22,128,14,23,197,1,23,196,1,28,23, -197,2,91,159,39,11,90,161,39,36,11,248,22,131,14,23,197,2,87,95,23, -195,1,23,194,1,27,28,23,202,2,27,248,22,136,14,23,199,2,28,249,22, -183,8,23,195,2,23,200,2,11,28,248,22,132,14,23,194,2,250,2,54,23, -205,2,23,206,2,249,22,128,14,23,200,2,23,198,1,250,2,54,23,205,2, +56,27,248,22,139,14,23,196,2,28,249,22,183,8,23,195,2,23,197,1,11, +28,248,22,135,14,23,194,2,27,249,22,131,14,23,197,1,23,196,1,28,23, +197,2,91,159,39,11,90,161,39,36,11,248,22,134,14,23,197,2,87,95,23, +195,1,23,194,1,27,28,23,202,2,27,248,22,139,14,23,199,2,28,249,22, +183,8,23,195,2,23,200,2,11,28,248,22,135,14,23,194,2,250,2,54,23, +205,2,23,206,2,249,22,131,14,23,200,2,23,198,1,250,2,54,23,205,2, 23,206,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22, -174,13,23,196,2,27,249,22,128,14,23,198,2,23,205,2,28,28,248,22,187, -13,193,10,248,22,186,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1, -28,23,203,2,11,27,248,22,136,14,23,200,2,28,249,22,183,8,23,195,2, -23,201,1,11,28,248,22,132,14,23,194,2,250,2,54,23,206,1,23,207,1, -249,22,128,14,23,201,1,23,198,1,250,2,54,205,206,195,192,87,94,23,194, -1,28,23,196,2,91,159,39,11,90,161,39,36,11,248,22,131,14,23,197,2, -87,95,23,195,1,23,194,1,27,28,23,201,2,27,248,22,136,14,23,199,2, -28,249,22,183,8,23,195,2,23,200,2,11,28,248,22,132,14,23,194,2,250, -2,54,23,204,2,23,205,2,249,22,128,14,23,200,2,23,198,1,250,2,54, +177,13,23,196,2,27,249,22,131,14,23,198,2,23,205,2,28,28,248,22,190, +13,193,10,248,22,189,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1, +28,23,203,2,11,27,248,22,139,14,23,200,2,28,249,22,183,8,23,195,2, +23,201,1,11,28,248,22,135,14,23,194,2,250,2,54,23,206,1,23,207,1, +249,22,131,14,23,201,1,23,198,1,250,2,54,205,206,195,192,87,94,23,194, +1,28,23,196,2,91,159,39,11,90,161,39,36,11,248,22,134,14,23,197,2, +87,95,23,195,1,23,194,1,27,28,23,201,2,27,248,22,139,14,23,199,2, +28,249,22,183,8,23,195,2,23,200,2,11,28,248,22,135,14,23,194,2,250, +2,54,23,204,2,23,205,2,249,22,131,14,23,200,2,23,198,1,250,2,54, 23,204,2,23,205,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27, -28,248,22,174,13,23,196,2,27,249,22,128,14,23,198,2,23,204,2,28,28, -248,22,187,13,193,10,248,22,186,13,193,192,11,11,28,23,193,2,192,87,94, -23,193,1,28,23,202,2,11,27,248,22,136,14,23,200,2,28,249,22,183,8, -23,195,2,23,201,1,11,28,248,22,132,14,23,194,2,250,2,54,23,205,1, -23,206,1,249,22,128,14,23,201,1,23,198,1,250,2,54,204,205,195,192,28, -23,193,2,91,159,39,11,90,161,39,36,11,248,22,131,14,23,199,2,87,95, +28,248,22,177,13,23,196,2,27,249,22,131,14,23,198,2,23,204,2,28,28, +248,22,190,13,193,10,248,22,189,13,193,192,11,11,28,23,193,2,192,87,94, +23,193,1,28,23,202,2,11,27,248,22,139,14,23,200,2,28,249,22,183,8, +23,195,2,23,201,1,11,28,248,22,135,14,23,194,2,250,2,54,23,205,1, +23,206,1,249,22,131,14,23,201,1,23,198,1,250,2,54,204,205,195,192,28, +23,193,2,91,159,39,11,90,161,39,36,11,248,22,134,14,23,199,2,87,95, 23,195,1,23,194,1,27,28,23,198,2,251,2,55,23,198,2,23,203,2,23, -201,2,23,202,2,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,174, -13,195,27,249,22,128,14,197,200,28,28,248,22,187,13,193,10,248,22,186,13, +201,2,23,202,2,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,177, +13,195,27,249,22,131,14,197,200,28,28,248,22,190,13,193,10,248,22,189,13, 193,192,11,11,28,192,192,28,198,11,251,2,55,198,203,201,202,194,32,58,89, 162,8,44,40,8,31,2,19,222,33,59,28,248,22,79,23,197,2,11,27,248, -22,135,14,248,22,72,23,199,2,27,249,22,128,14,23,196,1,23,197,2,28, -248,22,186,13,23,194,2,250,2,54,198,199,195,87,94,23,193,1,27,248,22, -73,23,200,1,28,248,22,79,23,194,2,11,27,248,22,135,14,248,22,72,23, -196,2,27,249,22,128,14,23,196,1,23,200,2,28,248,22,186,13,23,194,2, +22,138,14,248,22,72,23,199,2,27,249,22,131,14,23,196,1,23,197,2,28, +248,22,189,13,23,194,2,250,2,54,198,199,195,87,94,23,193,1,27,248,22, +73,23,200,1,28,248,22,79,23,194,2,11,27,248,22,138,14,248,22,72,23, +196,2,27,249,22,131,14,23,196,1,23,200,2,28,248,22,189,13,23,194,2, 250,2,54,201,202,195,87,94,23,193,1,27,248,22,73,23,197,1,28,248,22, -79,23,194,2,11,27,248,22,135,14,248,22,72,23,196,2,27,249,22,128,14, -23,196,1,23,203,2,28,248,22,186,13,23,194,2,250,2,54,204,205,195,87, +79,23,194,2,11,27,248,22,138,14,248,22,72,23,196,2,27,249,22,131,14, +23,196,1,23,203,2,28,248,22,189,13,23,194,2,250,2,54,204,205,195,87, 94,23,193,1,27,248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248, -22,135,14,248,22,72,23,196,2,27,249,22,128,14,23,196,1,23,206,2,28, -248,22,186,13,23,194,2,250,2,54,23,15,23,16,195,87,94,23,193,1,27, -248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248,22,135,14,248,22, -72,23,196,2,27,249,22,128,14,23,196,1,23,209,2,28,248,22,186,13,23, +22,138,14,248,22,72,23,196,2,27,249,22,131,14,23,196,1,23,206,2,28, +248,22,189,13,23,194,2,250,2,54,23,15,23,16,195,87,94,23,193,1,27, +248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248,22,138,14,248,22, +72,23,196,2,27,249,22,131,14,23,196,1,23,209,2,28,248,22,189,13,23, 194,2,250,2,54,23,18,23,19,195,87,94,23,193,1,27,248,22,73,23,197, -1,28,248,22,79,23,194,2,11,27,248,22,135,14,248,22,72,195,27,249,22, -128,14,23,196,1,23,19,28,248,22,186,13,193,250,2,54,23,21,23,22,195, -251,2,58,23,21,23,22,23,23,248,22,73,199,87,95,28,28,248,22,174,13, -23,195,2,10,28,248,22,175,6,23,195,2,28,248,22,132,14,23,195,2,10, -248,22,133,14,23,195,2,11,12,250,22,151,9,2,15,6,25,25,112,97,116, +1,28,248,22,79,23,194,2,11,27,248,22,138,14,248,22,72,195,27,249,22, +131,14,23,196,1,23,19,28,248,22,189,13,193,250,2,54,23,21,23,22,195, +251,2,58,23,21,23,22,23,23,248,22,73,199,87,95,28,28,248,22,177,13, +23,195,2,10,28,248,22,175,6,23,195,2,28,248,22,135,14,23,195,2,10, +248,22,136,14,23,195,2,11,12,250,22,151,9,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,2,28,28,248,22,174,13,23,196,2,10,28,248, -22,175,6,23,196,2,28,248,22,132,14,23,196,2,10,248,22,133,14,23,196, -2,11,248,22,132,14,23,196,2,11,10,12,250,22,151,9,2,15,6,29,29, +41,23,197,2,28,28,23,195,2,28,28,248,22,177,13,23,196,2,10,28,248, +22,175,6,23,196,2,28,248,22,135,14,23,196,2,10,248,22,136,14,23,196, +2,11,248,22,135,14,23,196,2,11,10,12,250,22,151,9,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,28,28,248,22,132,14,23,195,2,91, -159,39,11,90,161,39,36,11,248,22,131,14,23,198,2,249,22,181,8,194,68, +114,32,115,116,114,105,110,103,23,198,2,28,28,248,22,135,14,23,195,2,91, +159,39,11,90,161,39,36,11,248,22,134,14,23,198,2,249,22,181,8,194,68, 114,101,108,97,116,105,118,101,11,27,248,22,128,8,6,4,4,80,65,84,72, 27,28,23,194,2,27,249,80,159,41,48,38,23,197,1,9,28,249,22,181,8, -247,22,130,8,2,21,249,22,71,248,22,183,13,5,1,46,194,192,87,94,23, -194,1,9,28,248,22,79,23,194,2,11,27,248,22,135,14,248,22,72,23,196, -2,27,249,22,128,14,23,196,1,23,200,2,28,248,22,186,13,23,194,2,250, +247,22,130,8,2,21,249,22,71,248,22,186,13,5,1,46,194,192,87,94,23, +194,1,9,28,248,22,79,23,194,2,11,27,248,22,138,14,248,22,72,23,196, +2,27,249,22,131,14,23,196,1,23,200,2,28,248,22,189,13,23,194,2,250, 2,54,201,202,195,87,94,23,193,1,27,248,22,73,23,197,1,28,248,22,79, -23,194,2,11,27,248,22,135,14,248,22,72,23,196,2,27,249,22,128,14,23, -196,1,23,203,2,28,248,22,186,13,23,194,2,250,2,54,204,205,195,87,94, +23,194,2,11,27,248,22,138,14,248,22,72,23,196,2,27,249,22,131,14,23, +196,1,23,203,2,28,248,22,189,13,23,194,2,250,2,54,204,205,195,87,94, 23,193,1,27,248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248,22, -135,14,248,22,72,195,27,249,22,128,14,23,196,1,205,28,248,22,186,13,193, +138,14,248,22,72,195,27,249,22,131,14,23,196,1,205,28,248,22,189,13,193, 250,2,54,23,15,23,16,195,251,2,58,23,15,23,16,23,17,248,22,73,199, -27,248,22,135,14,23,196,1,28,248,22,186,13,193,250,2,54,198,199,195,11, +27,248,22,138,14,23,196,1,28,248,22,189,13,193,250,2,54,198,199,195,11, 250,80,159,39,49,37,196,197,11,250,80,159,39,49,37,196,11,11,87,94,249, 22,166,6,247,22,138,5,195,248,22,128,6,249,22,184,3,36,249,22,168,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,248,22,150,14,2,20,27,249,80,159,41,49,37,23,196,1,11,27, +197,1,27,248,22,153,14,2,20,27,249,80,159,41,49,37,23,196,1,11,27, 27,248,22,187,3,23,200,1,28,192,192,36,27,27,248,22,187,3,23,202,1, 28,192,192,36,249,22,169,5,23,197,1,83,158,40,20,100,95,89,162,8,44, 36,48,9,224,3,2,33,63,23,195,1,23,196,1,27,248,22,154,5,23,195, @@ -388,7 +388,7 @@ 222,33,47,80,159,36,46,37,83,158,36,16,2,83,158,39,20,99,96,2,13, 89,162,44,36,44,9,223,0,33,48,89,162,44,37,45,9,223,0,33,49,89, 162,44,38,55,9,223,0,33,50,80,159,36,47,37,83,158,36,16,2,27,248, -22,157,14,248,22,186,7,27,28,249,22,181,8,247,22,130,8,2,21,6,1, +22,160,14,248,22,186,7,27,28,249,22,181,8,247,22,130,8,2,21,6,1, 1,59,6,1,1,58,250,22,159,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,38,48,2,14,223, 0,33,53,80,159,36,48,37,83,158,36,16,2,83,158,39,20,99,96,2,15, @@ -400,13 +400,13 @@ EVAL_ONE_SIZED_STR((char *)expr, 6246); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,50,9,0,0,0,1,0,0,10,0,16, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,52,9,0,0,0,1,0,0,10,0,16, 0,29,0,44,0,58,0,72,0,86,0,128,0,0,0,57,1,0,0,69,35, 37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2,67,35,37, 117,116,105,108,115,11,29,94,2,2,69,35,37,110,101,116,119,111,114,107,11, 29,94,2,2,68,35,37,112,97,114,97,109,122,11,29,94,2,2,68,35,37, 101,120,112,111,98,115,11,29,94,2,2,68,35,37,107,101,114,110,101,108,11, -97,36,11,8,240,103,79,0,0,98,159,2,3,36,36,159,2,4,36,36,159, +97,36,11,8,240,127,81,0,0,98,159,2,3,36,36,159,2,4,36,36,159, 2,5,36,36,159,2,6,36,36,159,2,7,36,36,159,2,7,36,36,16,0, 159,36,20,105,159,36,16,1,11,16,0,83,158,42,20,103,145,2,1,2,1, 29,11,11,11,11,11,18,96,11,44,44,44,36,80,158,36,36,20,105,159,36, @@ -420,7 +420,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 353); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,50,74,0,0,0,1,0,0,7,0,18, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,52,74,0,0,0,1,0,0,7,0,18, 0,45,0,51,0,64,0,73,0,80,0,102,0,124,0,150,0,162,0,180,0, 200,0,212,0,228,0,251,0,7,1,38,1,45,1,50,1,55,1,60,1,65, 1,70,1,79,1,84,1,88,1,94,1,101,1,107,1,115,1,124,1,145,1, @@ -446,40 +446,40 @@ 97,109,101,5,3,46,122,111,5,3,46,122,111,6,6,6,110,97,116,105,118, 101,64,108,111,111,112,63,108,105,98,6,3,3,46,115,115,6,4,4,46,114, 107,116,5,4,46,114,107,116,67,105,103,110,111,114,101,100,249,22,14,195,80, -159,38,46,38,250,22,128,14,23,197,1,23,199,1,249,80,159,43,39,38,23, -198,1,2,23,250,22,128,14,23,197,1,23,199,1,249,80,159,43,39,38,23, -198,1,2,24,252,22,128,14,23,199,1,23,201,1,2,25,247,22,131,8,249, -80,159,45,39,38,23,200,1,80,159,45,36,38,252,22,128,14,23,199,1,23, +159,38,46,38,250,22,131,14,23,197,1,23,199,1,249,80,159,43,39,38,23, +198,1,2,23,250,22,131,14,23,197,1,23,199,1,249,80,159,43,39,38,23, +198,1,2,24,252,22,131,14,23,199,1,23,201,1,2,25,247,22,131,8,249, +80,159,45,39,38,23,200,1,80,159,45,36,38,252,22,131,14,23,199,1,23, 201,1,2,25,247,22,131,8,249,80,159,45,39,38,23,200,1,80,159,45,36, -38,27,252,22,128,14,23,200,1,23,202,1,2,25,247,22,131,8,249,80,159, -46,39,38,23,201,1,80,159,46,36,38,27,250,22,145,14,196,11,32,0,89, -162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,252,22,128,14, +38,27,252,22,131,14,23,200,1,23,202,1,2,25,247,22,131,8,249,80,159, +46,39,38,23,201,1,80,159,46,36,38,27,250,22,148,14,196,11,32,0,89, +162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,252,22,131,14, 23,200,1,23,202,1,2,25,247,22,131,8,249,80,159,46,39,38,23,201,1, -80,159,46,36,38,27,250,22,145,14,196,11,32,0,89,162,8,44,36,41,9, -222,11,28,192,249,22,71,195,194,11,27,250,22,128,14,23,198,1,23,200,1, -249,80,159,44,39,38,23,199,1,2,23,27,250,22,145,14,196,11,32,0,89, -162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,250,22,128,14, -23,198,1,23,200,1,249,80,159,44,39,38,23,199,1,2,24,27,250,22,145, +80,159,46,36,38,27,250,22,148,14,196,11,32,0,89,162,8,44,36,41,9, +222,11,28,192,249,22,71,195,194,11,27,250,22,131,14,23,198,1,23,200,1, +249,80,159,44,39,38,23,199,1,2,23,27,250,22,148,14,196,11,32,0,89, +162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,250,22,131,14, +23,198,1,23,200,1,249,80,159,44,39,38,23,199,1,2,24,27,250,22,148, 14,196,11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,195,194, 11,87,94,28,248,80,159,37,38,38,23,195,2,12,250,22,151,9,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,97,116,104,32,115,116,114,105,110, -103,23,197,2,91,159,46,11,90,161,37,36,11,28,248,22,134,14,23,205,2, -23,204,2,27,247,22,143,5,28,23,193,2,249,22,135,14,23,207,2,23,195, -1,23,205,2,90,161,39,37,11,248,22,131,14,23,205,1,87,94,23,196,1, -90,161,38,40,11,28,23,205,2,27,248,22,179,13,23,197,2,27,248,22,166, +103,23,197,2,91,159,46,11,90,161,37,36,11,28,248,22,137,14,23,205,2, +23,204,2,27,247,22,143,5,28,23,193,2,249,22,138,14,23,207,2,23,195, +1,23,205,2,90,161,39,37,11,248,22,134,14,23,205,1,87,94,23,196,1, +90,161,38,40,11,28,23,205,2,27,248,22,182,13,23,197,2,27,248,22,166, 7,23,195,2,28,28,249,22,180,3,23,195,2,40,249,22,169,7,5,4,46, 114,107,116,249,22,172,7,23,198,2,249,22,168,3,23,199,2,40,11,249,22, -7,23,199,2,248,22,183,13,249,22,173,7,250,22,172,7,23,202,1,36,249, +7,23,199,2,248,22,186,13,249,22,173,7,250,22,172,7,23,202,1,36,249, 22,168,3,23,203,1,40,5,3,46,115,115,249,22,7,23,199,2,11,249,22, 7,23,197,2,11,90,161,37,42,11,28,249,22,181,8,23,199,2,23,197,2, -23,193,2,249,22,128,14,23,196,2,23,199,2,90,161,37,43,11,28,23,198, +23,193,2,249,22,131,14,23,196,2,23,199,2,90,161,37,43,11,28,23,198, 2,28,249,22,181,8,23,200,2,23,197,1,23,193,1,87,94,23,193,1,249, -22,128,14,23,196,2,23,200,2,87,94,23,195,1,11,90,161,37,44,11,28, +22,131,14,23,196,2,23,200,2,87,94,23,195,1,11,90,161,37,44,11,28, 249,22,181,8,23,196,2,68,114,101,108,97,116,105,118,101,87,94,23,194,1, -2,22,23,194,1,90,161,37,45,11,247,22,153,14,27,27,250,22,145,14,23, +2,22,23,194,1,90,161,37,45,11,247,22,156,14,27,27,250,22,148,14,23, 204,2,11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,23,203, -2,194,11,27,28,23,202,2,28,23,194,2,11,27,250,22,145,14,23,206,2, +2,194,11,27,28,23,202,2,28,23,194,2,11,27,250,22,148,14,23,206,2, 11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,23,205,2,194, 11,11,27,28,23,195,2,23,195,2,23,194,2,27,89,162,44,37,50,62,122, 111,225,14,12,8,33,33,27,89,162,44,37,50,66,97,108,116,45,122,111,225, @@ -494,8 +494,8 @@ 1,23,199,1,23,198,1,23,196,1,23,195,1,23,194,1,20,14,159,80,159, 56,40,38,250,80,159,59,41,38,249,22,27,11,80,159,8,25,40,38,22,167, 4,11,20,14,159,80,159,56,40,38,250,80,159,59,41,38,249,22,27,11,80, -159,8,25,40,38,22,143,5,28,248,22,174,13,23,215,2,23,214,1,87,94, -23,214,1,247,22,151,14,249,247,22,156,14,248,22,72,195,23,24,87,94,23, +159,8,25,40,38,22,143,5,28,248,22,177,13,23,215,2,23,214,1,87,94, +23,214,1,247,22,154,14,249,247,22,159,14,248,22,72,195,23,24,87,94,23, 193,1,27,28,23,195,2,28,23,197,1,27,249,22,5,89,162,8,44,37,53, 9,225,24,22,19,33,38,23,216,2,27,28,23,204,2,11,193,28,192,192,28, 193,28,203,28,249,22,180,3,248,22,73,196,248,22,73,206,193,11,11,11,11, @@ -503,8 +503,8 @@ 23,208,1,23,201,1,23,200,1,23,199,1,23,196,1,23,195,1,20,14,159, 80,159,57,40,38,250,80,159,8,24,41,38,249,22,27,11,80,159,8,26,40, 38,22,167,4,23,214,1,20,14,159,80,159,57,40,38,250,80,159,8,24,41, -38,249,22,27,11,80,159,8,26,40,38,22,143,5,28,248,22,174,13,23,216, -2,23,215,1,87,94,23,215,1,247,22,151,14,249,247,22,156,14,248,22,72, +38,249,22,27,11,80,159,8,26,40,38,22,143,5,28,248,22,177,13,23,216, +2,23,215,1,87,94,23,215,1,247,22,154,14,249,247,22,159,14,248,22,72, 195,23,25,87,94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5, 83,158,40,20,100,94,89,162,8,44,37,51,9,225,25,23,19,33,39,23,212, 1,23,217,2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28, @@ -513,8 +513,8 @@ 23,211,1,23,210,1,23,202,1,23,200,1,23,197,1,23,196,1,20,14,159, 80,159,58,40,38,250,80,159,8,25,41,38,249,22,27,11,80,159,8,27,40, 38,22,167,4,11,20,14,159,80,159,58,40,38,250,80,159,8,25,41,38,249, -22,27,11,80,159,8,27,40,38,22,143,5,28,248,22,174,13,23,217,2,23, -216,1,87,94,23,216,1,247,22,151,14,249,247,22,141,5,248,22,72,195,23, +22,27,11,80,159,8,27,40,38,22,143,5,28,248,22,177,13,23,217,2,23, +216,1,87,94,23,216,1,247,22,154,14,249,247,22,141,5,248,22,72,195,23, 26,87,94,23,193,1,27,28,23,197,1,28,23,201,1,27,249,22,5,83,158, 40,20,100,94,89,162,8,44,37,51,9,225,26,24,21,33,40,23,214,1,23, 218,1,27,28,23,205,2,11,193,28,192,192,28,193,28,204,28,249,22,180,3, @@ -522,21 +522,21 @@ 11,87,94,23,201,1,11,28,23,193,2,87,95,23,212,1,23,198,1,20,14, 159,80,159,59,40,38,250,80,159,8,26,41,38,249,22,27,11,80,159,8,28, 40,38,22,167,4,23,216,1,20,14,159,80,159,59,40,38,250,80,159,8,26, -41,38,249,22,27,11,80,159,8,28,40,38,22,143,5,28,248,22,174,13,23, -218,2,23,217,1,87,94,23,217,1,247,22,151,14,249,247,22,141,5,248,22, +41,38,249,22,27,11,80,159,8,28,40,38,22,143,5,28,248,22,177,13,23, +218,2,23,217,1,87,94,23,217,1,247,22,154,14,249,247,22,141,5,248,22, 72,195,23,27,87,94,23,193,1,27,28,23,199,2,87,94,23,214,1,23,213, 1,87,94,23,213,1,23,214,1,20,14,159,80,159,8,24,40,38,250,80,159, 8,27,41,38,249,22,27,11,80,159,8,29,40,38,22,167,4,28,23,29,28, 23,202,1,11,195,87,94,23,202,1,11,20,14,159,80,159,8,24,40,38,250, 80,159,8,27,41,38,249,22,27,11,80,159,8,29,40,38,22,143,5,28,248, -22,174,13,23,219,2,23,218,1,87,94,23,218,1,247,22,151,14,249,247,22, +22,177,13,23,219,2,23,218,1,87,94,23,218,1,247,22,154,14,249,247,22, 141,5,194,23,28,0,17,35,114,120,34,94,40,46,42,63,41,47,40,46,42, -41,36,34,32,43,89,162,8,44,37,59,2,26,222,33,44,27,249,22,161,14, +41,36,34,32,43,89,162,8,44,37,59,2,26,222,33,44,27,249,22,164,14, 2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23, -196,2,27,248,22,105,23,197,1,27,249,22,161,14,2,42,23,196,2,28,23, +196,2,27,248,22,105,23,197,1,27,249,22,164,14,2,42,23,196,2,28,23, 193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23, -197,1,27,249,22,161,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1, -249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,161,14, +197,1,27,249,22,164,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1, +249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,164,14, 2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23, 196,2,248,2,43,248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22, 81,194,248,22,81,194,32,45,89,162,44,37,55,2,26,222,33,46,28,248,22, @@ -546,12 +546,12 @@ 22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90, 161,38,36,11,248,2,45,248,22,73,196,249,22,7,249,22,71,248,22,72,199, 196,195,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248, -22,72,199,196,195,27,27,249,22,161,14,2,42,23,197,2,28,23,193,2,87, +22,72,199,196,195,27,27,249,22,164,14,2,42,23,197,2,28,23,193,2,87, 94,23,195,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27, -249,22,161,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71, -248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,161,14,2,42,23, +249,22,164,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71, +248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,164,14,2,42,23, 196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27, -248,22,105,23,197,1,27,249,22,161,14,2,42,23,196,2,28,23,193,2,87, +248,22,105,23,197,1,27,249,22,164,14,2,42,23,196,2,28,23,193,2,87, 94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,43,248,22,105,23,197, 1,248,22,81,194,248,22,81,194,248,22,81,194,248,22,81,195,28,23,195,1, 192,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159, @@ -563,20 +563,20 @@ 249,22,71,248,22,72,199,196,195,87,95,28,248,22,185,4,195,12,250,22,151, 9,2,18,6,20,20,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,150,2,80,159,42,43,38,248,22,186,14,247,22,154,12,11,28, +27,27,250,22,150,2,80,159,42,43,38,248,22,189,14,247,22,157,12,11,28, 23,193,2,192,87,94,23,193,1,27,247,22,130,2,87,94,250,22,148,2,80, -159,43,43,38,248,22,186,14,247,22,154,12,195,192,250,22,148,2,195,198,66, +159,43,43,38,248,22,189,14,247,22,157,12,195,192,250,22,148,2,195,198,66, 97,116,116,97,99,104,251,211,197,198,199,10,28,192,250,22,150,9,11,196,195, 248,22,148,9,194,32,51,89,162,44,37,52,2,26,222,33,52,28,248,22,79, 248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38, 36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9, 248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,51,248,22,73,196,249, 22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22,72,199, -196,195,32,53,89,162,8,44,37,55,2,26,222,33,54,27,249,22,161,14,2, +196,195,32,53,89,162,8,44,37,55,2,26,222,33,54,27,249,22,164,14,2, 42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196, -2,27,248,22,105,23,197,1,27,249,22,161,14,2,42,23,196,2,28,23,193, +2,27,248,22,105,23,197,1,27,249,22,164,14,2,42,23,196,2,28,23,193, 2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197, -1,27,249,22,161,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249, +1,27,249,22,164,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249, 22,71,248,22,96,23,196,2,248,2,53,248,22,105,23,197,1,248,22,81,194, 248,22,81,194,248,22,81,194,32,55,89,162,44,37,52,2,26,222,33,56,28, 248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11, @@ -584,10 +584,10 @@ 22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,55,248,22, 73,196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248, 22,72,199,196,195,32,57,89,162,8,44,37,55,2,26,222,33,58,27,249,22, -161,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, -96,23,196,2,27,248,22,105,23,197,1,27,249,22,161,14,2,42,23,196,2, +164,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, +96,23,196,2,27,248,22,105,23,197,1,27,249,22,164,14,2,42,23,196,2, 28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22, -105,23,197,1,27,249,22,161,14,2,42,23,196,2,28,23,193,2,87,94,23, +105,23,197,1,27,249,22,164,14,2,42,23,196,2,28,23,193,2,87,94,23, 194,1,249,22,71,248,22,96,23,196,2,248,2,57,248,22,105,23,197,1,248, 22,81,194,248,22,81,194,248,22,81,194,28,249,22,181,6,194,6,1,1,46, 2,22,28,249,22,181,6,194,6,2,2,46,46,62,117,112,192,0,11,35,114, @@ -597,16 +597,16 @@ 249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,61,248, 22,73,196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71, 248,22,72,199,196,195,32,63,89,162,8,44,37,55,2,26,222,33,64,27,249, -22,161,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248, -22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,161,14,2,42,23,196, +22,164,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248, +22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,164,14,2,42,23,196, 2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248, -22,105,23,197,1,27,249,22,161,14,2,42,23,196,2,28,23,193,2,87,94, +22,105,23,197,1,27,249,22,164,14,2,42,23,196,2,28,23,193,2,87,94, 23,194,1,249,22,71,248,22,96,23,196,2,248,2,63,248,22,105,23,197,1, 248,22,81,194,248,22,81,194,248,22,81,194,32,65,89,162,8,44,37,55,2, -26,222,33,66,27,249,22,161,14,2,42,23,196,2,28,23,193,2,87,94,23, +26,222,33,66,27,249,22,164,14,2,42,23,196,2,28,23,193,2,87,94,23, 194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22, -161,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, -96,23,196,2,27,248,22,105,23,197,1,27,249,22,161,14,2,42,23,196,2, +164,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, +96,23,196,2,27,248,22,105,23,197,1,27,249,22,164,14,2,42,23,196,2, 28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,65, 248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,27,248,2, 65,23,195,1,192,28,249,22,183,8,248,22,73,23,200,2,23,197,1,28,249, @@ -614,9 +614,9 @@ 99,121,99,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,73,248,22,86,249,22,71,23,206, 1,23,202,1,12,12,247,192,20,14,159,80,159,40,45,38,249,22,71,248,22, -186,14,247,22,154,12,23,197,1,20,14,159,80,159,40,40,38,250,80,159,43, +189,14,247,22,157,12,23,197,1,20,14,159,80,159,40,40,38,250,80,159,43, 41,38,249,22,27,11,80,159,45,40,38,22,166,4,23,196,1,249,247,22,142, -5,23,198,1,248,22,59,248,22,178,13,23,198,1,87,94,28,28,248,22,174, +5,23,198,1,248,22,59,248,22,181,13,23,198,1,87,94,28,28,248,22,177, 13,23,196,2,10,248,22,129,5,23,196,2,12,28,23,197,2,250,22,150,9, 11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23,200, 2,250,22,151,9,2,18,6,19,19,109,111,100,117,108,101,45,112,97,116,104, @@ -630,77 +630,77 @@ 12,252,212,199,200,201,202,80,158,42,50,87,94,23,193,1,27,89,162,8,44, 37,46,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114, 114,223,5,33,50,27,28,248,22,56,23,198,2,27,250,22,150,2,80,159,43, -44,38,249,22,71,23,203,2,247,22,152,14,11,28,23,193,2,192,87,94,23, +44,38,249,22,71,23,203,2,247,22,155,14,11,28,23,193,2,192,87,94,23, 193,1,91,159,38,11,90,161,38,36,11,27,248,22,62,23,202,2,248,2,51, 248,2,53,23,195,1,27,251,80,159,47,54,38,2,18,23,202,1,28,248,22, 79,23,199,2,23,199,2,248,22,72,23,199,2,28,248,22,79,23,199,2,9, -248,22,73,23,199,2,249,22,128,14,23,195,1,28,248,22,79,23,197,1,87, +248,22,73,23,199,2,249,22,131,14,23,195,1,28,248,22,79,23,197,1,87, 94,23,197,1,6,8,8,109,97,105,110,46,114,107,116,249,22,134,7,23,199, 1,6,4,4,46,114,107,116,28,248,22,175,6,23,198,2,87,94,23,194,1, 27,27,28,23,200,2,28,249,22,181,8,23,202,2,80,158,43,47,80,158,41, -48,27,248,22,187,4,23,202,2,28,248,22,174,13,23,194,2,91,159,39,11, -90,161,39,36,11,248,22,131,14,23,197,1,87,95,83,160,38,11,80,158,45, +48,27,248,22,187,4,23,202,2,28,248,22,177,13,23,194,2,91,159,39,11, +90,161,39,36,11,248,22,134,14,23,197,1,87,95,83,160,38,11,80,158,45, 47,23,204,2,83,160,38,11,80,158,45,48,192,192,11,11,28,23,193,2,192, 87,94,23,193,1,27,247,22,143,5,28,23,193,2,192,87,94,23,193,1,247, -22,151,14,27,250,22,150,2,80,159,44,44,38,249,22,71,23,204,2,23,199, +22,154,14,27,250,22,150,2,80,159,44,44,38,249,22,71,23,204,2,23,199, 2,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90,161,38,36,11, -248,2,55,248,2,57,23,203,2,250,22,1,22,128,14,23,199,1,249,22,85, +248,2,55,248,2,57,23,203,2,250,22,1,22,131,14,23,199,1,249,22,85, 249,22,2,32,0,89,162,8,44,37,44,9,222,33,59,23,200,1,248,22,81, 27,248,22,178,6,23,202,2,28,249,22,180,3,194,39,28,249,22,181,6,2, 28,249,22,133,7,204,249,22,168,3,198,39,249,22,134,7,250,22,133,7,205, -36,249,22,168,3,199,39,2,29,200,200,28,248,22,174,13,23,198,2,87,94, -23,194,1,28,248,22,133,14,23,198,2,91,159,39,11,90,161,39,36,11,248, -22,131,14,23,201,2,87,95,23,195,1,23,193,1,28,249,22,161,14,2,60, -248,22,179,13,23,197,1,249,80,159,44,53,38,23,202,2,2,30,23,200,2, +36,249,22,168,3,199,39,2,29,200,200,28,248,22,177,13,23,198,2,87,94, +23,194,1,28,248,22,136,14,23,198,2,91,159,39,11,90,161,39,36,11,248, +22,134,14,23,201,2,87,95,23,195,1,23,193,1,28,249,22,164,14,2,60, +248,22,182,13,23,197,1,249,80,159,44,53,38,23,202,2,2,30,23,200,2, 248,22,81,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,181,8,248,22,72,23,200, 2,2,27,27,250,22,150,2,80,159,43,44,38,249,22,71,23,203,2,247,22, -152,14,11,28,23,193,2,192,87,94,23,193,1,91,159,39,11,90,161,38,36, +155,14,11,28,23,193,2,192,87,94,23,193,1,91,159,39,11,90,161,38,36, 11,27,248,22,96,23,203,2,248,2,61,248,2,63,23,195,1,90,161,37,38, -11,28,248,22,79,248,22,98,23,203,2,28,248,22,79,23,194,2,249,22,165, +11,28,248,22,79,248,22,98,23,203,2,28,248,22,79,23,194,2,249,22,168, 14,0,8,35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197, 2,249,22,85,28,248,22,79,248,22,98,23,207,2,21,93,6,5,5,109,122, 108,105,98,249,22,1,22,85,249,22,2,32,0,89,162,8,44,37,44,9,222, 33,67,248,22,98,23,210,2,23,197,2,28,248,22,79,23,196,2,248,22,81, 23,197,2,23,195,2,251,80,159,49,54,38,2,18,23,204,1,248,22,72,23, -198,2,248,22,73,23,198,1,249,22,128,14,23,195,1,28,23,198,1,87,94, +198,2,248,22,73,23,198,1,249,22,131,14,23,195,1,28,23,198,1,87,94, 23,196,1,27,248,22,178,6,23,199,2,28,249,22,180,3,194,39,28,249,22, 181,6,2,28,249,22,133,7,201,249,22,168,3,198,39,249,22,134,7,250,22, 133,7,202,36,249,22,168,3,199,39,2,29,197,197,28,248,22,79,23,197,1, -87,94,23,197,1,6,8,8,109,97,105,110,46,114,107,116,28,249,22,165,14, +87,94,23,197,1,6,8,8,109,97,105,110,46,114,107,116,28,249,22,168,14, 0,8,35,114,120,34,91,46,93,34,23,199,2,27,248,22,178,6,23,199,2, 28,249,22,180,3,194,39,28,249,22,181,6,2,28,249,22,133,7,201,249,22, 168,3,198,39,249,22,134,7,250,22,133,7,202,36,249,22,168,3,199,39,2, 29,197,197,249,22,134,7,23,199,1,6,4,4,46,114,107,116,28,249,22,181, -8,248,22,72,23,200,2,64,102,105,108,101,27,249,22,135,14,248,22,139,14, +8,248,22,72,23,200,2,64,102,105,108,101,27,249,22,138,14,248,22,142,14, 248,22,96,23,202,2,27,28,23,202,2,28,249,22,181,8,23,204,2,80,158, -45,47,80,158,43,48,27,248,22,187,4,23,204,2,28,248,22,174,13,23,194, -2,91,159,39,11,90,161,39,36,11,248,22,131,14,23,197,1,87,95,83,160, +45,47,80,158,43,48,27,248,22,187,4,23,204,2,28,248,22,177,13,23,194, +2,91,159,39,11,90,161,39,36,11,248,22,134,14,23,197,1,87,95,83,160, 38,11,80,158,47,47,23,206,2,83,160,38,11,80,158,47,48,192,192,11,11, 28,23,193,2,192,87,94,23,193,1,27,247,22,143,5,28,23,193,2,192,87, -94,23,193,1,247,22,151,14,91,159,39,11,90,161,39,36,11,248,22,131,14, -23,197,2,87,95,23,195,1,23,193,1,28,249,22,161,14,2,60,248,22,179, +94,23,193,1,247,22,154,14,91,159,39,11,90,161,39,36,11,248,22,134,14, +23,197,2,87,95,23,195,1,23,193,1,28,249,22,164,14,2,60,248,22,182, 13,23,197,1,249,80,159,45,53,38,23,198,1,2,30,195,12,87,94,28,28, -248,22,174,13,23,194,2,10,248,22,133,8,23,194,2,87,94,23,199,1,12, +248,22,177,13,23,194,2,10,248,22,133,8,23,194,2,87,94,23,199,1,12, 28,23,199,2,250,22,150,9,67,114,101,113,117,105,114,101,249,22,159,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,72,23,199,2,6,0,0,23,202,1,87,94,23,199,1,250,22, 151,9,2,18,249,22,159,7,6,13,13,109,111,100,117,108,101,32,112,97,116, 104,126,97,28,23,198,2,248,22,72,23,199,2,6,0,0,23,200,2,27,28, -248,22,133,8,23,195,2,249,22,138,8,23,196,2,36,249,22,137,14,248,22, -138,14,23,197,2,11,27,28,248,22,133,8,23,196,2,249,22,138,8,23,197, +248,22,133,8,23,195,2,249,22,138,8,23,196,2,36,249,22,140,14,248,22, +141,14,23,197,2,11,27,28,248,22,133,8,23,196,2,249,22,138,8,23,197, 2,37,248,80,159,42,55,38,23,195,2,91,159,39,11,90,161,39,36,11,28, 248,22,133,8,23,199,2,250,22,7,2,31,249,22,138,8,23,203,2,38,2, -31,248,22,131,14,23,198,2,87,95,23,195,1,23,193,1,27,28,248,22,133, +31,248,22,134,14,23,198,2,87,95,23,195,1,23,193,1,27,28,248,22,133, 8,23,200,2,249,22,138,8,23,201,2,39,249,80,159,47,53,38,23,197,2, 5,0,27,28,248,22,133,8,23,201,2,249,22,138,8,23,202,2,40,248,22, -186,4,23,200,2,27,27,250,22,150,2,80,159,51,43,38,248,22,186,14,247, -22,154,12,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,2,87,94, -250,22,148,2,80,159,52,43,38,248,22,186,14,247,22,154,12,195,192,87,95, +186,4,23,200,2,27,27,250,22,150,2,80,159,51,43,38,248,22,189,14,247, +22,157,12,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,2,87,94, +250,22,148,2,80,159,52,43,38,248,22,189,14,247,22,157,12,195,192,87,95, 28,23,208,1,27,250,22,150,2,23,197,2,197,11,28,23,193,1,12,87,95, 27,27,28,248,22,17,80,159,51,46,38,80,159,50,46,38,247,22,19,250,22, -25,248,22,23,23,197,2,80,159,53,45,38,23,196,1,27,248,22,186,14,247, -22,154,12,249,22,3,83,158,40,20,100,94,89,162,8,44,37,55,9,226,12, +25,248,22,23,23,197,2,80,159,53,45,38,23,196,1,27,248,22,189,14,247, +22,157,12,249,22,3,83,158,40,20,100,94,89,162,8,44,37,55,9,226,12, 11,2,3,33,68,23,195,1,23,196,1,248,28,248,22,17,80,159,50,46,38, 32,0,89,162,44,37,42,9,222,33,69,80,159,49,59,37,89,162,44,36,51, 9,227,13,9,8,4,3,33,70,250,22,148,2,23,197,1,197,10,12,28,28, @@ -709,14 +709,14 @@ 2,27,11,250,22,148,2,80,159,50,44,38,28,248,22,175,6,23,209,2,249, 22,71,23,210,1,27,28,23,212,2,28,249,22,181,8,23,214,2,80,158,55, 47,87,94,23,212,1,80,158,53,48,27,248,22,187,4,23,214,2,28,248,22, -174,13,23,194,2,91,159,39,11,90,161,39,36,11,248,22,131,14,23,197,1, +177,13,23,194,2,91,159,39,11,90,161,39,36,11,248,22,134,14,23,197,1, 87,95,83,160,38,11,80,158,57,47,23,23,83,160,38,11,80,158,57,48,192, 192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,143,5,28,23,193, -2,192,87,94,23,193,1,247,22,151,14,249,22,71,23,210,1,247,22,152,14, +2,192,87,94,23,193,1,247,22,154,14,249,22,71,23,210,1,247,22,155,14, 252,22,135,8,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193,87,96, 83,160,38,11,80,158,36,50,248,80,159,37,58,38,249,22,27,11,80,159,39, 52,38,248,22,165,4,80,159,37,51,38,248,22,142,5,80,159,37,37,37,248, -22,145,13,80,159,37,42,37,83,160,38,11,80,158,36,50,248,80,159,37,58, +22,148,13,80,159,37,42,37,83,160,38,11,80,158,36,50,248,80,159,37,58, 38,249,22,27,11,80,159,39,52,38,159,36,20,105,159,36,16,1,11,16,0, 83,158,42,20,103,145,2,1,2,1,29,11,11,11,11,11,10,38,80,158,36, 36,20,105,159,37,16,23,2,2,2,3,30,2,5,72,112,97,116,104,45,115, diff --git a/src/racket/src/mzmark.c b/src/racket/src/mzmark.c index adc252cbf6..01a7bfc361 100644 --- a/src/racket/src/mzmark.c +++ b/src/racket/src/mzmark.c @@ -3404,6 +3404,7 @@ static int place_async_channel_val_SIZE(void *p, struct NewGC *gc) { static int place_async_channel_val_MARK(void *p, struct NewGC *gc) { Scheme_Place_Async_Channel *pac = (Scheme_Place_Async_Channel *)p; int i; + gcMARK2(pac->msgs, gc); for (i = pac->size; i--; ) gcMARK2(pac->msgs[i], gc); @@ -3414,6 +3415,7 @@ static int place_async_channel_val_MARK(void *p, struct NewGC *gc) { static int place_async_channel_val_FIXUP(void *p, struct NewGC *gc) { Scheme_Place_Async_Channel *pac = (Scheme_Place_Async_Channel *)p; int i; + gcFIXUP2(pac->msgs, gc); for (i = pac->size; i--; ) gcFIXUP2(pac->msgs[i], gc); @@ -3834,6 +3836,7 @@ static int mark_print_params_MARK(void *p, struct NewGC *gc) { gcMARK2(pp->print_port, gc); gcMARK2(pp->print_buffer, gc); gcMARK2(pp->depth_delta, gc); + gcMARK2(pp->uq_ht, gc); return gcBYTES_TO_WORDS(sizeof(PrintParams)); } @@ -3844,6 +3847,7 @@ static int mark_print_params_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(pp->print_port, gc); gcFIXUP2(pp->print_buffer, gc); gcFIXUP2(pp->depth_delta, gc); + gcFIXUP2(pp->uq_ht, gc); return gcBYTES_TO_WORDS(sizeof(PrintParams)); } diff --git a/src/racket/src/mzmarksrc.c b/src/racket/src/mzmarksrc.c index 989a484072..2397b5419e 100644 --- a/src/racket/src/mzmarksrc.c +++ b/src/racket/src/mzmarksrc.c @@ -1564,6 +1564,7 @@ mark_print_params { gcMARK2(pp->print_port, gc); gcMARK2(pp->print_buffer, gc); gcMARK2(pp->depth_delta, gc); + gcMARK2(pp->uq_ht, gc); size: gcBYTES_TO_WORDS(sizeof(PrintParams)); } diff --git a/src/racket/src/portfun.c b/src/racket/src/portfun.c index e0dcf9f082..45af607608 100644 --- a/src/racket/src/portfun.c +++ b/src/racket/src/portfun.c @@ -3697,8 +3697,10 @@ static Scheme_Object *sch_default_global_port_print_handler(int argc, Scheme_Obj { if (!SCHEME_OUTPUT_PORTP(argv[1])) scheme_wrong_type("default-global-port-print-handler", "output-port", 1, argc, argv); - if ((argc > 2) && !scheme_nonneg_exact_p(argv[2])) - scheme_wrong_type("default-global-port-print-handler", "non-negative exact integer", + if ((argc > 2) + && !SAME_OBJ(argv[2], scheme_make_integer(0)) + && !SAME_OBJ(argv[2], scheme_make_integer(1))) + scheme_wrong_type("default-global-port-print-handler", "0 or 1", 2, argc, argv); if (argc == 2) { @@ -3772,8 +3774,9 @@ display_write(char *name, if (argc > 2) { h = argv[2]; - if (!scheme_nonneg_exact_p(h)) - scheme_wrong_type(name, "non-negative exact integer", 2, argc, argv); + if (!SAME_OBJ(h, scheme_make_integer(0)) + && !SAME_OBJ(h, scheme_make_integer(1))) + scheme_wrong_type(name, "0 or 1", 2, argc, argv); } else h = scheme_make_integer(0); diff --git a/src/racket/src/print.c b/src/racket/src/print.c index d452d64dfd..e6e172684a 100644 --- a/src/racket/src/print.c +++ b/src/racket/src/print.c @@ -95,6 +95,7 @@ typedef struct Scheme_Print_Params { Scheme_Object *print_port; mz_jmp_buf *print_escape; Scheme_Object *depth_delta; /* for large qq depth */ + Scheme_Hash_Table *uq_ht; } PrintParams; #ifdef MZ_PRECISE_GC @@ -475,8 +476,12 @@ static Scheme_Object *check_cycle_k(void) #endif static int check_cycles(Scheme_Object *obj, int for_write, Scheme_Hash_Table *ht, PrintParams *pp) +/* Results: 0x2 = cycle bit + 0x1 = unquote bit */ { Scheme_Type t; + Scheme_Object *val; + int res, res2; #ifdef DO_STACK_CHECK { @@ -507,17 +512,27 @@ static int check_cycles(Scheme_Object *obj, int for_write, Scheme_Hash_Table *ht || (pp->print_hash_table && (SAME_TYPE(t, scheme_hash_table_type) || SAME_TYPE(t, scheme_hash_tree_type)))) { - if (scheme_hash_get(ht, obj)) - return 1; - scheme_hash_set(ht, obj, (Scheme_Object *)0x1); + val = scheme_hash_get(ht, obj); + if (val) + return SCHEME_INT_VAL(val); + scheme_hash_set(ht, obj, scheme_make_integer(0x2)); } else return 0; - - if (SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj)) { - if (check_cycles(SCHEME_CAR(obj), for_write, ht, pp)) - return 1; - if (check_cycles(SCHEME_CDR(obj), for_write, ht, pp)) - return 1; + + if (SCHEME_PAIRP(obj)) { + res = check_cycles(SCHEME_CAR(obj), for_write, ht, pp); + if ((for_write < 3) && res) + return res; + res2 = check_cycles(SCHEME_CDR(obj), for_write, ht, pp); + res |= res2; + } else if (SCHEME_MUTABLE_PAIRP(obj)) { + res = check_cycles(SCHEME_CAR(obj), for_write, ht, pp); + if ((for_write < 3) && res) + return res; + res2 = check_cycles(SCHEME_CDR(obj), for_write, ht, pp); + res |= res2; + if (for_write >= 3) + res |= 0x1; /* always escape for qq printing */ } else if (SCHEME_CHAPERONE_BOXP(obj)) { /* got here => printable */ Scheme_Object *v; @@ -525,8 +540,7 @@ static int check_cycles(Scheme_Object *obj, int for_write, Scheme_Hash_Table *ht v = SCHEME_BOX_VAL(obj); else v = scheme_unbox(obj); - if (check_cycles(v, for_write, ht, pp)) - return 1; + res = check_cycles(v, for_write, ht, pp); } else if (SCHEME_CHAPERONE_VECTORP(obj)) { int i, len; Scheme_Object *v; @@ -535,29 +549,47 @@ static int check_cycles(Scheme_Object *obj, int for_write, Scheme_Hash_Table *ht len = SCHEME_VEC_SIZE(obj); else len = SCHEME_VEC_SIZE(SCHEME_CHAPERONE_VAL(obj)); + res = 0; for (i = 0; i < len; i++) { if (SCHEME_VECTORP(obj)) v = SCHEME_VEC_ELS(obj)[i]; else v = scheme_chaperone_vector_ref(obj, i); - if (check_cycles(v, for_write, ht, pp)) { - return 1; - } + res2 = check_cycles(v, for_write, ht, pp); + res |= res2; + if ((for_write < 3) && res) + return res; } } else if (SAME_TYPE(t, scheme_structure_type) || SAME_TYPE(t, scheme_proc_struct_type)) { - if (scheme_is_writable_struct(obj)) { - if (check_cycles(writable_struct_subs(obj, for_write, pp), for_write, ht, pp)) - return 1; + if (scheme_is_print_as_constructor_struct(obj)) { + /* Struct wants to be unquoted. */ + if (pp->print_unreadable) { + res = check_cycles(writable_struct_subs(obj, for_write, pp), for_write, ht, pp); + if (for_write >= 3) + res |= 0x1; + } else + res = 0; + } else if (scheme_is_writable_struct(obj)) { + /* A "writeable" struct can be quoted or not. */ + if (pp->print_unreadable) + res = check_cycles(writable_struct_subs(obj, for_write, pp), for_write, ht, pp); + else + res = 0; } else { /* got here => printable */ int i = SCHEME_STRUCT_NUM_SLOTS(obj); + if ((for_write >= 3) && !SCHEME_PREFABP(obj)) + res = 0x1; + else + res = 0; while (i--) { if (scheme_inspector_sees_part(obj, pp->inspector, i)) { - if (check_cycles(((Scheme_Structure *)obj)->slots[i], for_write, ht, pp)) { - return 1; - } + res2 = check_cycles(((Scheme_Structure *)obj)->slots[i], for_write, ht, pp); + res |= res2; + if ((for_write < 3) && res) + return res; } } } @@ -574,6 +606,7 @@ static int check_cycles(Scheme_Object *obj, int for_write, Scheme_Hash_Table *ht keys = t->keys; vals = t->vals; + res = 0; for (i = 0; i < t->size; i++) { if (vals[i]) { key = keys[i]; @@ -582,10 +615,14 @@ static int check_cycles(Scheme_Object *obj, int for_write, Scheme_Hash_Table *ht else val = vals[i]; if (val) { - if (check_cycles(key, for_write, ht, pp)) - return 1; - if (check_cycles(val, for_write, ht, pp)) - return 1; + res2 = check_cycles(key, for_write, ht, pp); + res |= res2; + if ((for_write < 3) && res) + return res; + res2 = check_cycles(val, for_write, ht, pp); + res |= res2; + if ((for_write < 3) && res) + return res; } } } @@ -600,31 +637,42 @@ static int check_cycles(Scheme_Object *obj, int for_write, Scheme_Hash_Table *ht else t = (Scheme_Hash_Tree *)obj; + res = 0; i = scheme_hash_tree_next(t, -1); while (i != -1) { scheme_hash_tree_index(t, i, &key, &val); if (!SAME_OBJ((Scheme_Object *)t, obj)) val = scheme_chaperone_hash_traversal_get(obj, key); - if (check_cycles(key, for_write, ht, pp)) - return 1; - if (check_cycles(val, for_write, ht, pp)) - return 1; + res2 = check_cycles(key, for_write, ht, pp); + res |= res2; + if ((for_write < 3) && res) + return res; + res2 = check_cycles(val, for_write, ht, pp); + res |= res2; + if ((for_write < 3) && res) + return res; i = scheme_hash_tree_next(t, i); } - } + } else + res = 0; - scheme_hash_set(ht, obj, NULL); + scheme_hash_set(ht, obj, scheme_make_integer(res)); - return 0; + return res; } /* The fast cycle-checker plays a dangerous game: it changes type tags. No GCs can occur here, and no thread switches. If the fast version takes to long, we back out to the general case. (We don't - even check for stack overflow, so keep the max limit low.) */ + even check for stack overflow, so keep the max limit low.) + + A 0 result means no cycles, a 1 result means cycles, and a -1 result + means "unknown" (i.e., try slow path). When write is >= 3 (implying + qq-based printing), then a 0 result also implies that no expression + escapes are needed. */ #if !defined(MZ_USE_PLACES) -static int check_cycles_fast(Scheme_Object *obj, PrintParams *pp, int *fast_checker_counter) +static int check_cycles_fast(Scheme_Object *obj, PrintParams *pp, int *fast_checker_counter, int write) XFORM_SKIP_PROC { Scheme_Type t; @@ -637,15 +685,23 @@ static int check_cycles_fast(Scheme_Object *obj, PrintParams *pp, int *fast_chec if ((*fast_checker_counter)-- < 0) return -1; - if (SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj)) { + if (SCHEME_PAIRP(obj) || ((write < 3) && SCHEME_MUTABLE_PAIRP(obj))) { obj->type = -t; - cycle = check_cycles_fast(SCHEME_CAR(obj), pp, fast_checker_counter); + cycle = check_cycles_fast(SCHEME_CAR(obj), pp, fast_checker_counter, write); if (!cycle) - cycle = check_cycles_fast(SCHEME_CDR(obj), pp, fast_checker_counter); + cycle = check_cycles_fast(SCHEME_CDR(obj), pp, fast_checker_counter, write); + obj->type = t; + } else if (SCHEME_MUTABLE_PAIRP(obj)) { + if (write >= 3) + return -1; + obj->type = -t; + cycle = check_cycles_fast(SCHEME_CAR(obj), pp, fast_checker_counter, write); + if (!cycle) + cycle = check_cycles_fast(SCHEME_CDR(obj), pp, fast_checker_counter, write); obj->type = t; } else if (pp->print_box && SCHEME_BOXP(obj)) { obj->type = -t; - cycle = check_cycles_fast(SCHEME_BOX_VAL(obj), pp, fast_checker_counter); + cycle = check_cycles_fast(SCHEME_BOX_VAL(obj), pp, fast_checker_counter, write); obj->type = t; } else if (SCHEME_VECTORP(obj)) { int i, len; @@ -653,7 +709,7 @@ static int check_cycles_fast(Scheme_Object *obj, PrintParams *pp, int *fast_chec obj->type = -t; len = SCHEME_VEC_SIZE(obj); for (i = 0; i < len; i++) { - cycle = check_cycles_fast(SCHEME_VEC_ELS(obj)[i], pp, fast_checker_counter); + cycle = check_cycles_fast(SCHEME_VEC_ELS(obj)[i], pp, fast_checker_counter, write); if (cycle) break; } @@ -668,11 +724,14 @@ static int check_cycles_fast(Scheme_Object *obj, PrintParams *pp, int *fast_chec cycle = -1; } else if (pp->print_struct && PRINTABLE_STRUCT(obj, pp)) { int i = SCHEME_STRUCT_NUM_SLOTS(obj); + + if ((write >= 3) && !SCHEME_PREFABP(obj)) + return -1; obj->type = -t; while (i--) { if (scheme_inspector_sees_part(obj, pp->inspector, i)) { - cycle = check_cycles_fast(((Scheme_Structure *)obj)->slots[i], pp, fast_checker_counter); + cycle = check_cycles_fast(((Scheme_Structure *)obj)->slots[i], pp, fast_checker_counter, write); if (cycle) break; } @@ -890,6 +949,7 @@ print_to_string(Scheme_Object *obj, Scheme_Object *qq_depth) { Scheme_Hash_Table * volatile ht; + Scheme_Hash_Table *uq_ht; Scheme_Object *v; char *ca; int cycles; @@ -994,19 +1054,22 @@ print_to_string(Scheme_Object *obj, params.inspector = v; } - if (params.print_graph) + uq_ht = NULL; + + if (params.print_graph && (write < 3)) cycles = 1; else { #ifdef MZ_USE_PLACES cycles = -1; #else int fast_checker_counter = 50; - cycles = check_cycles_fast(obj, (PrintParams *)¶ms, &fast_checker_counter); + cycles = check_cycles_fast(obj, (PrintParams *)¶ms, &fast_checker_counter, write); #endif - if (cycles == -1) { - ht = scheme_make_hash_table(SCHEME_hash_ptr); - cycles = check_cycles(obj, write, ht, (PrintParams *)¶ms); - } + if ((cycles == -1) || (cycles && (write >= 3))) { + uq_ht = scheme_make_hash_table(SCHEME_hash_ptr); + cycles = check_cycles(obj, write, uq_ht, (PrintParams *)¶ms); + } else if (!cycles && params.print_graph) + cycles = 1; } if (cycles) @@ -1019,6 +1082,8 @@ print_to_string(Scheme_Object *obj, else params.print_escape = NULL; + params.uq_ht = uq_ht; + if ((maxl <= PRINT_MAXLEN_MIN) || !scheme_setjmp(escape)) print(obj, write, 0, ht, NULL, (PrintParams *)¶ms); @@ -1654,22 +1719,35 @@ static void always_scheme(PrintParams *pp, int reset) } } -static int to_quoted(PrintParams *pp, int notdisplay, const char *quote) +static int to_quoted(Scheme_Object *obj, PrintParams *pp, int notdisplay) { if (notdisplay == 3) { - print_utf8_string(pp, quote, 0, 1); - return notdisplay + 1; + if (!obj || !pp->uq_ht) + obj = scheme_make_integer(0); + else { + obj = scheme_hash_get(pp->uq_ht, obj); + if (!obj) obj = scheme_make_integer(0); + } + + if (!(SCHEME_INT_VAL(obj) & 0x1)) { + print_utf8_string(pp, "'", 0, 1); + return notdisplay + 1; + } else + return notdisplay; } else return notdisplay; } -static int to_unquoted(PrintParams *pp, int notdisplay) +static int is_graph_point(Scheme_Hash_Table *ht, Scheme_Object *obj) { - while (notdisplay > 3) { - print_utf8_string(pp, ",", 0, 1); - --notdisplay; - } - return notdisplay; + if (ht) { + long v; + v = (long)scheme_hash_get(ht, obj); + if ((v == 0) || (v == 1)) + return 0; + return 1; + } else + return 0; } static int @@ -1846,9 +1924,9 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, || SAME_OBJ(obj, unquote_splicing_symbol)) print_utf8_string(pp, ",'", 0, 2); else - notdisplay = to_quoted(pp, notdisplay, "'"); + notdisplay = to_quoted(NULL, pp, notdisplay); } else - notdisplay = to_quoted(pp, notdisplay, "'"); + notdisplay = to_quoted(NULL, pp, notdisplay); } if (is_kw) @@ -1976,7 +2054,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, if (compact) { print_compact(pp, CPT_NULL); } else { - notdisplay = to_quoted(pp, notdisplay, "'"); + notdisplay = to_quoted(NULL, pp, notdisplay); if (pp->honu_mode) print_utf8_string(pp, "null", 0, 4); else @@ -1986,13 +2064,12 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, } else if (SCHEME_PAIRP(obj)) { - notdisplay = to_quoted(pp, notdisplay, "`"); + notdisplay = to_quoted(obj, pp, notdisplay); print_pair(obj, notdisplay, compact, ht, mt, pp, scheme_pair_type, !pp->print_pair_curly, 0); closed = 1; } else if (SCHEME_MUTABLE_PAIRP(obj)) { - notdisplay = to_quoted(pp, notdisplay, "`"); if (compact || !pp->print_unreadable) cannot_print(pp, notdisplay, obj, ht, compact); print_pair(obj, notdisplay, compact, ht, mt, pp, scheme_mutable_pair_type, !pp->print_mpair_curly, 0); @@ -2000,7 +2077,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, } else if (SCHEME_CHAPERONE_VECTORP(obj)) { - notdisplay = to_quoted(pp, notdisplay, "`"); + notdisplay = to_quoted(obj, pp, notdisplay); print_vector(obj, notdisplay, compact, ht, mt, pp, 0); closed = 1; } @@ -2014,14 +2091,19 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, print_compact(pp, CPT_BOX); else { always_scheme(pp, 1); - notdisplay = to_quoted(pp, notdisplay, "`"); - print_utf8_string(pp, "#&", 0, 2); + notdisplay = to_quoted(obj, pp, notdisplay); + if (notdisplay == 3) + print_utf8_string(pp, "(box ", 0, 5); + else + print_utf8_string(pp, "#&", 0, 2); } if (SCHEME_BOXP(obj)) content = SCHEME_BOX_VAL(obj); else content = scheme_unbox(obj); closed = print(content, notdisplay, compact, ht, mt, pp); + if (notdisplay == 3) + print_utf8_string(pp, ")", 0, 1); } } else if ((compact || pp->print_hash_table) @@ -2048,8 +2130,11 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, print_compact_number(pp, 0); } else { always_scheme(pp, 1); - notdisplay = to_quoted(pp, notdisplay, "`"); - print_utf8_string(pp, "#hash", 0, 5); + notdisplay = to_quoted(obj, pp, notdisplay); + if (notdisplay == 3) + print_utf8_string(pp, "(hash ", 0, 6); + else + print_utf8_string(pp, "#hash", 0, 5); if (SCHEME_HASHTP(obj)) { if (!scheme_is_hash_table_equal(obj)) { if (scheme_is_hash_table_eqv(obj)) @@ -2065,7 +2150,8 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, print_utf8_string(pp, "eq", 0, 2); } } - print_utf8_string(pp, "(", 0, 1); + if (notdisplay != 3) + print_utf8_string(pp, "(", 0, 1); } if (SCHEME_HASHTP(obj)) { @@ -2108,21 +2194,28 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, if (!compact) { if (did_one) print_utf8_string(pp, " ", 0, 1); - print_utf8_string(pp, "(", 0, 1); + if (notdisplay != 3) + print_utf8_string(pp, "(", 0, 1); } print(key, notdisplay, compact, ht, mt, pp); - if (!compact) - print_utf8_string(pp, " . ", 0, 3); + if (!compact) { + if (notdisplay == 3) + print_utf8_string(pp, " ", 0, 1); + else + print_utf8_string(pp, " . ", 0, 3); + } print(val, notdisplay, compact, ht, mt, pp); - if (!compact) + if (!compact && (notdisplay != 3)) print_utf8_string(pp, ")", 0, 1); did_one++; } } } - if (!compact) + if (!compact && (notdisplay != 3)) print_utf8_string(pp, ")", 0, 1); + if (notdisplay == 3) + print_utf8_string(pp, ")", 0, 1); closed = 1; } @@ -2167,6 +2260,8 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, } else if (compact || !pp->print_unreadable) { cannot_print(pp, notdisplay, obj, ht, compact); } else if (scheme_is_writable_struct(obj)) { + if ((notdisplay == 3) && !scheme_is_print_as_constructor_struct(obj)) + notdisplay = to_quoted(obj, pp, notdisplay); custom_write_struct(obj, ht, mt, pp, notdisplay); } else { int pb; @@ -2177,16 +2272,15 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, Scheme_Object *vec, *prefab; prefab = ((Scheme_Structure *)obj)->stype->prefab_key; vec = scheme_struct_to_vector(obj, (notdisplay >= 3) ? qq_ellipses : NULL, pp->inspector); - if ((notdisplay >= 3) && !prefab) { - notdisplay = to_unquoted(pp, notdisplay); + if (prefab) + notdisplay = to_quoted(obj, pp, notdisplay); + if (notdisplay == 3) { vec = scheme_vector_to_list(vec); vec = scheme_make_pair(scheme_object_name(obj), SCHEME_CDR(vec)); print_pair(vec, notdisplay, compact, ht, mt, pp, scheme_pair_type, !pp->print_pair_curly, 1); } else { - if (prefab) { + if (prefab) SCHEME_VEC_ELS(vec)[0] = SCHEME_CDR(prefab); - notdisplay = to_quoted(pp, notdisplay, "`"); - } print_vector(vec, notdisplay, compact, ht, mt, pp, !!prefab); } closed = 1; @@ -3191,74 +3285,6 @@ print_byte_string(const char *str, int delta, int len, int notdisplay, PrintPara } } -static int is_special_reader_form(PrintParams *pp, int notdisplay, Scheme_Object *p) -{ - Scheme_Object *v; - - if (notdisplay && pp->print_reader) { - v = SCHEME_CAR(p); - p = SCHEME_CDR(p); - if (!SCHEME_PAIRP(p)) return 0; - p = SCHEME_CDR(p); - if (!SCHEME_NULLP(p)) return 0; - if (SCHEME_SYMBOLP(v)) { - if (SAME_OBJ(v, quote_symbol) - || SAME_OBJ(v, quasiquote_symbol) - || (SAME_OBJ(v, unquote_symbol) && (notdisplay != 4)) - || (SAME_OBJ(v, unquote_splicing_symbol) && (notdisplay != 4)) - || SAME_OBJ(v, syntax_symbol) - || SAME_OBJ(v, quasisyntax_symbol) - || SAME_OBJ(v, unsyntax_symbol) - || SAME_OBJ(v, unsyntax_splicing_symbol)) - return 1; - - } - } - return 0; -} - -static int print_special_reader_form(Scheme_Object *v, PrintParams *pp, int notdisplay) -{ - const char *str; - int len; - - if (SAME_OBJ(v, quote_symbol)) { - str = "'"; - len = 1; - } else if (SAME_OBJ(v, quasiquote_symbol)) { - str = "`"; - len = 1; - notdisplay++; - } else if (SAME_OBJ(v, unquote_symbol)) { - str = ","; - len = 1; - --notdisplay; - } else if (SAME_OBJ(v, unquote_splicing_symbol)) { - str = ",@"; - len = 2; - --notdisplay; - } else if (SAME_OBJ(v, syntax_symbol)) { - str = "#'"; - len = 2; - } else if (SAME_OBJ(v, quasisyntax_symbol)) { - str = "#`"; - len = 2; - } else if (SAME_OBJ(v, unsyntax_symbol)) { - str = "#,"; - len = 2; - } else if (SAME_OBJ(v, unsyntax_splicing_symbol)) { - str = "#,@"; - len = 3; - } else { - str = "???"; - len = 3; - } - - print_utf8_string(pp, str, 0, len); - - return notdisplay; -} - static void print_pair(Scheme_Object *pair, int notdisplay, int compact, Scheme_Hash_Table *ht, @@ -3276,7 +3302,7 @@ print_pair(Scheme_Object *pair, int notdisplay, int compact, pr = pair; while (SAME_TYPE(SCHEME_TYPE(pr), pair_type)) { if (ht) - if ((long)scheme_hash_get(ht, pr) != 1) { + if (is_graph_point(ht, pr)) { c = -1; break; } @@ -3303,7 +3329,7 @@ print_pair(Scheme_Object *pair, int notdisplay, int compact, cdr = SCHEME_CDR(pair); while (SAME_TYPE(SCHEME_TYPE(cdr), pair_type)) { if (ht) { - if ((long)scheme_hash_get(ht, cdr) != 1) { + if (is_graph_point(ht, cdr)) { /* This needs a tag */ break; } @@ -3330,7 +3356,7 @@ print_pair(Scheme_Object *pair, int notdisplay, int compact, while (SAME_TYPE(SCHEME_TYPE(cdr), pair_type)) { print_utf8_string(pp, ", ", 0, 2); if (ht) { - if ((long)scheme_hash_get(ht, cdr) != 1) { + if (is_graph_point(ht, cdr)) { /* This needs a tag */ (void)print(cdr, notdisplay, compact, ht, mt, pp); break; @@ -3355,13 +3381,22 @@ print_pair(Scheme_Object *pair, int notdisplay, int compact, if (!super_compact) print_compact(pp, CPT_PAIR); } else { - if (round_parens) { - if (!first_unquoted && is_special_reader_form(pp, notdisplay, pair)) { - notdisplay = print_special_reader_form(SCHEME_CAR(pair), pp, notdisplay); - (void)print(SCHEME_CADR(pair), notdisplay, compact, ht, mt, pp); - return; - } else - print_utf8_string(pp,"(", 0, 1); + if ((notdisplay == 3) && !first_unquoted) { + if (SAME_TYPE(pair_type, scheme_pair_type)) { + if (scheme_is_list(pair)) + print_utf8_string(pp,"(list ", 0, 6); + else if (!SCHEME_PAIRP(SCHEME_CDR(pair)) + || is_graph_point(ht, SCHEME_CDR(pair))) + print_utf8_string(pp,"(cons ", 0, 6); + else + print_utf8_string(pp,"(list* ", 0, 7); + } else { + pair_type = -1; + print_utf8_string(pp,"(mcons ", 0, 7); + } + round_parens = 1; + } else if (round_parens) { + print_utf8_string(pp,"(", 0, 1); } else print_utf8_string(pp,"{", 0, 1); } @@ -3369,13 +3404,16 @@ print_pair(Scheme_Object *pair, int notdisplay, int compact, print(SCHEME_CAR(pair), (first_unquoted ? 1 : notdisplay), compact, ht, mt, pp); cdr = SCHEME_CDR(pair); - while (SAME_TYPE(SCHEME_TYPE(cdr), pair_type) - && !is_special_reader_form(pp, notdisplay, pair)) { + while (SAME_TYPE(SCHEME_TYPE(cdr), pair_type)) { if (ht && !super_compact) { - if ((long)scheme_hash_get(ht, cdr) != 1) { + if (is_graph_point(ht, cdr)) { /* This needs a tag */ - if (!compact) - print_utf8_string(pp, " . ", 0, 3); + if (!compact) { + if (notdisplay == 3) + print_utf8_string(pp, " ", 0, 1); + else + print_utf8_string(pp, " . ", 0, 3); + } (void)print(cdr, notdisplay, compact, ht, mt, pp); if (!compact) { if (round_parens) @@ -3395,8 +3433,12 @@ print_pair(Scheme_Object *pair, int notdisplay, int compact, } if (!SCHEME_NULLP(cdr)) { - if (!compact) - print_utf8_string(pp, " . ", 0, 3); + if (!compact) { + if (notdisplay == 3) + print_utf8_string(pp, " ", 0, 1); + else + print_utf8_string(pp, " . ", 0, 3); + } print(cdr, notdisplay, compact, ht, mt, pp); } else if (compact && (super_compact < 1)) print_compact(pp, CPT_NULL); @@ -3440,7 +3482,7 @@ print_vector(Scheme_Object *vec, int notdisplay, int compact, if (as_prefab) { print_utf8_string(pp, "#s(", 0, 3); - } else if (notdisplay && pp->print_vec_shorthand) { + } else if (notdisplay && pp->print_vec_shorthand && (notdisplay != 3)) { if (size == 0) { if (pp->honu_mode) print_utf8_string(pp, "vectorN(0", 0, 7); @@ -3454,6 +3496,8 @@ print_vector(Scheme_Object *vec, int notdisplay, int compact, } } else if (pp->honu_mode) print_utf8_string(pp, "vector(", 0, 7); + else if (notdisplay == 3) + print_utf8_string(pp, "(vector ", 0, 8); else print_utf8_string(pp, "#(", 0, 2); } @@ -3597,7 +3641,8 @@ static Scheme_Object *accum_write(void *_b, int argc, Scheme_Object **argv) static Scheme_Object *writable_struct_subs(Scheme_Object *s, int for_write, PrintParams *pp) { - Scheme_Object *v, *o, *a[3], *b, *accum_proc; + Scheme_Object *v, *o, *a[3], *b; + Scheme_Object *d_accum_proc, *w_accum_proc, *p_accum_proc; Scheme_Output_Port *op; v = scheme_is_writable_struct(s); @@ -3608,14 +3653,22 @@ static Scheme_Object *writable_struct_subs(Scheme_Object *s, int for_write, Prin op = (Scheme_Output_Port *)o; b = scheme_box(scheme_null); - accum_proc = scheme_make_closed_prim_w_arity(accum_write, + d_accum_proc = scheme_make_closed_prim_w_arity(accum_write, b, - "custom-write-recur-handler", + "custom-display-recur-handler", 2, 2); + w_accum_proc = scheme_make_closed_prim_w_arity(accum_write, + b, + "custom-write-recur-handler", + 2, 2); + p_accum_proc = scheme_make_closed_prim_w_arity(accum_write, + b, + "custom-print-recur-handler", + 2, 3); - op->display_handler = accum_proc; - op->write_handler = accum_proc; - op->print_handler = accum_proc; + op->display_handler = d_accum_proc; + op->write_handler = w_accum_proc; + op->print_handler = p_accum_proc; a[0] = s; a[1] = o; @@ -3651,7 +3704,7 @@ static Scheme_Object *custom_recur(int notdisplay, void *_vec, int argc, Scheme_ if (!SCHEME_OUTPORTP(argv[1])) { scheme_wrong_type((notdisplay > 1) ? "print/recursive" - : (notdisplay ? "write/recusrive" : "display/recursive"), + : (notdisplay ? "write/recursive" : "display/recursive"), "output-port", 1, argc, argv); return NULL; } diff --git a/src/racket/src/read.c b/src/racket/src/read.c index 2c5854b9c4..cd6e61412b 100644 --- a/src/racket/src/read.c +++ b/src/racket/src/read.c @@ -539,7 +539,7 @@ void scheme_init_read(Scheme_Env *env) GLOBAL_PARAMETER("print-honu", print_honu, MZCONFIG_HONU_MODE, env); GLOBAL_PARAMETER("print-syntax-width", print_syntax_width, MZCONFIG_PRINT_SYNTAX_WIDTH, env); GLOBAL_PARAMETER("print-reader-abbreviations", print_reader, MZCONFIG_PRINT_READER, env); - GLOBAL_PARAMETER("print-as-quasiquote", print_as_qq, MZCONFIG_PRINT_AS_QQ, env); + GLOBAL_PARAMETER("print-as-expression", print_as_qq, MZCONFIG_PRINT_AS_QQ, env); GLOBAL_PRIM_W_ARITY("make-readtable", make_readtable, 1, -1, env); GLOBAL_FOLDING_PRIM("readtable?", readtable_p, 1, 1, 1, env); @@ -766,7 +766,7 @@ print_reader(int argc, Scheme_Object *argv[]) static Scheme_Object * print_as_qq(int argc, Scheme_Object *argv[]) { - DO_CHAR_PARAM("print-as-quasiquote", MZCONFIG_PRINT_AS_QQ); + DO_CHAR_PARAM("print-as-expression", MZCONFIG_PRINT_AS_QQ); } static Scheme_Object *good_syntax_width(int c, Scheme_Object **argv) diff --git a/src/racket/src/schminc.h b/src/racket/src/schminc.h index a2b9d1a3aa..5e8568479a 100644 --- a/src/racket/src/schminc.h +++ b/src/racket/src/schminc.h @@ -11,9 +11,9 @@ EXPECTED_PRIM_COUNT to the new value, and then USE_COMPILED_STARTUP can be set to 1 again. */ -#define USE_COMPILED_STARTUP 0 +#define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 992 +#define EXPECTED_PRIM_COUNT 995 #define EXPECTED_UNSAFE_COUNT 65 #define EXPECTED_FLFXNUM_COUNT 53 diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 032e5dc5fa..95e28c5e61 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -719,6 +719,7 @@ Scheme_Object *scheme_proc_struct_name_source(Scheme_Object *a); Scheme_Object *scheme_object_name(Scheme_Object *a); Scheme_Object *scheme_is_writable_struct(Scheme_Object *s); +Scheme_Object *scheme_is_print_as_constructor_struct(Scheme_Object *s); #define SCHEME_STRUCT_INSPECTOR(obj) (((Scheme_Structure *)obj)->stype->inspector) diff --git a/src/racket/src/schvers.h b/src/racket/src/schvers.h index 26253c89f2..6cb3169978 100644 --- a/src/racket/src/schvers.h +++ b/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "4.2.5.13" +#define MZSCHEME_VERSION "4.2.5.14" #define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Z 5 -#define MZSCHEME_VERSION_W 13 +#define MZSCHEME_VERSION_W 14 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) diff --git a/src/racket/src/struct.c b/src/racket/src/struct.c index 31026c2cc3..e575ccc94c 100644 --- a/src/racket/src/struct.c +++ b/src/racket/src/struct.c @@ -40,6 +40,7 @@ READ_ONLY Scheme_Object *scheme_write_special_symbol; READ_ONLY static Scheme_Object *location_struct; READ_ONLY static Scheme_Object *write_property; +READ_ONLY static Scheme_Object *print_as_constructor_property; READ_ONLY static Scheme_Object *evt_property; READ_ONLY static Scheme_Object *proc_property; READ_ONLY static Scheme_Object *rename_transformer_property; @@ -87,6 +88,7 @@ static Scheme_Object *chaperone_property_p(int argc, Scheme_Object *argv[]); static Scheme_Object *check_evt_property_value_ok(int argc, Scheme_Object *argv[]); static Scheme_Object *check_equal_property_value_ok(int argc, Scheme_Object *argv[]); static Scheme_Object *check_write_property_value_ok(int argc, Scheme_Object *argv[]); +static Scheme_Object *check_print_as_constructor_property_value_ok(int argc, Scheme_Object *argv[]); static Scheme_Object *check_input_port_property_value_ok(int argc, Scheme_Object *argv[]); static Scheme_Object *check_output_port_property_value_ok(int argc, Scheme_Object *argv[]); static Scheme_Object *check_rename_transformer_property_value_ok(int argc, Scheme_Object *argv[]); @@ -283,6 +285,22 @@ scheme_init_struct (Scheme_Env *env) scheme_add_global_constant("custom-write?", pred, env); scheme_add_global_constant("custom-write-accessor", access, env); } + + REGISTER_SO(print_as_constructor_property); + { + Scheme_Object *a[2], *pred, *access; + guard = scheme_make_prim_w_arity(check_print_as_constructor_property_value_ok, + "guard-for-prop:custom-print-as-constructor", + 2, 2); + + a[0] = scheme_intern_symbol("custom-print-as-constructor"); + a[1] = guard; + print_as_constructor_property = make_struct_type_property_from_c(2, a, &pred, &access, + scheme_struct_property_type); + scheme_add_global_constant("prop:custom-print-as-constructor", print_as_constructor_property, env); + scheme_add_global_constant("custom-print-as-constructor?", pred, env); + scheme_add_global_constant("custom-print-as-constructor-accessor", access, env); + } REGISTER_SO(evt_property); { @@ -1463,11 +1481,26 @@ static Scheme_Object *check_write_property_value_ok(int argc, Scheme_Object *arg return v; } +static Scheme_Object *check_print_as_constructor_property_value_ok(int argc, Scheme_Object *argv[]) +{ + if (SCHEME_TRUEP(argv[0])) + return scheme_true; + else + return scheme_false; +} + Scheme_Object *scheme_is_writable_struct(Scheme_Object *s) { return scheme_struct_type_property_ref(write_property, s); } +Scheme_Object *scheme_is_print_as_constructor_struct(Scheme_Object *s) +{ + s = scheme_struct_type_property_ref(print_as_constructor_property, s); + if (!s || SCHEME_FALSEP(s)) return NULL; + return scheme_true; +} + /*========================================================================*/ /* rename and set! transformer properties */ /*========================================================================*/