scheme/flonum (v4.2.3.8)

svn: r17348
This commit is contained in:
Matthew Flatt 2009-12-18 15:40:00 +00:00
parent 5f7d1792ad
commit fdd7122994
34 changed files with 1853 additions and 766 deletions

View File

@ -14,6 +14,7 @@
(parameterize ([current-namespace ns]) (parameterize ([current-namespace ns])
(namespace-require ''#%kernel) (namespace-require ''#%kernel)
(namespace-require ''#%unsafe) (namespace-require ''#%unsafe)
(namespace-require ''#%flonum)
(for/list ([l (namespace-mapped-symbols)]) (for/list ([l (namespace-mapped-symbols)])
(cons l (with-handlers ([exn:fail? (lambda (x) #f)]) (cons l (with-handlers ([exn:fail? (lambda (x) #f)])
(compile l))))))] (compile l))))))]
@ -350,16 +351,23 @@
[else #f])) [else #f]))
(if (and (symbol? (car a)) (if (and (symbol? (car a))
(case (length a) (case (length a)
[(2) (memq (car a) '(unsafe-flabs [(2) (memq (car a) '(flabs flsqrt ->fl
unsafe-flabs
unsafe-flsqrt unsafe-flsqrt
unsafe-fx->fl))] unsafe-fx->fl))]
[(3) (memq (car a) '(unsafe-fl+ unsafe-fl- unsafe-fl* unsafe-fl/ [(3) (memq (car a) '(fl+ fl- fl* fl/
fl< fl> fl<= fl>= fl=
flvector-ref
unsafe-fl+ unsafe-fl- unsafe-fl* unsafe-fl/
unsafe-fl< unsafe-fl> unsafe-fl< unsafe-fl>
unsafe-fl= unsafe-fl=
unsafe-fl<= unsafe-fl>= unsafe-fl<= unsafe-fl>=
unsafe-flvector-ref))] unsafe-flvector-ref
unsafe-f64vector-ref))]
[(4) (memq (car a) '(unsafe-flvector-set!))] [(4) (memq (car a) '(flvector-set!
unsafe-flvector-set!
unsafe-f64vector-set!))]
[else #f]) [else #f])
(andmap unboxable? args (cdr a))) (andmap unboxable? args (cdr a)))
(cons '#%flonum a) (cons '#%flonum a)

View File

@ -19,10 +19,14 @@
(define-syntax-rule (define-inliner define-fx numtype? numtype-str) (define-syntax-rule (define-inliner define-fx numtype? numtype-str)
(... (...
(begin (begin
(define-syntax define-an-fx (define-syntax (define-an-fx stx)
(syntax-rules () (syntax-case stx ()
[(_ orig fx check-result ([(arg ...) (tmp ...)] ...) . rest) [(_ orig fx binary-op check-result ([(arg ...) (tmp ...)] ...) . rest)
(begin (with-syntax ([(extra-clauses ...)
(if (syntax-e #'binary-op)
#'([(_ arg1 arg2) (binary-op arg1 arg2)])
#'())])
#'(begin
(provide fx) (provide fx)
(define fx-proc (define fx-proc
(let ([fx (case-lambda (let ([fx (case-lambda
@ -38,18 +42,19 @@
(define-syntax fx (define-syntax fx
(inline-rules (inline-rules
fx-proc fx-proc
extra-clauses ...
[(_ arg ...) [(_ arg ...)
(let ([tmp arg] ...) (let ([tmp arg] ...)
(if (and (numtype? tmp) ...) (if (and (numtype? tmp) ...)
(let ([v (orig tmp ...)]) (let ([v (orig tmp ...)])
(check-result v (fx-proc tmp ...))) (check-result v (fx-proc tmp ...)))
(fx-proc tmp ...)))] (fx-proc tmp ...)))]
...)))])) ...))))]))
(define-syntax define-an-fx+rest (define-syntax define-an-fx+rest
(syntax-rules () (syntax-rules ()
[(_ orig fx check clauses) [(_ orig fx binary-op check clauses)
(define-an-fx orig fx check clauses (define-an-fx orig fx binary-op check clauses
[args (for-each (lambda (arg) [args (for-each (lambda (arg)
(unless (numtype? arg) (unless (numtype? arg)
(raise-type-error 'fx numtype-str arg))) (raise-type-error 'fx numtype-str arg)))
@ -61,28 +66,28 @@
(define-syntax define-fx (define-syntax define-fx
(syntax-rules (...) (syntax-rules (...)
[(_ orig fx [(a) (b c)] check) [(_ orig fx binary-op [(a) (b c)] check)
(define-an-fx orig fx check (define-an-fx orig fx binary-op check
([(a) (t1)] ([(a) (t1)]
[(b c) (t1 t2)]))] [(b c) (t1 t2)]))]
[(_ orig fx [(a) (b c (... ...))] check) [(_ orig fx binary-op [(a) (b c (... ...))] check)
(define-an-fx+rest orig fx check (define-an-fx+rest orig fx binary-op check
([(a) (t1)] ([(a) (t1)]
[(b c) (t1 t2)]))] [(b c) (t1 t2)]))]
[(_ orig fx (a b c (... ...)) check) [(_ orig fx binary-op (a b c (... ...)) check)
(define-an-fx+rest orig fx check (define-an-fx+rest orig fx binary-op check
([(a b) (t1 t2)]))] ([(a b) (t1 t2)]))]
[(_ orig fx (a b (... ...)) check) [(_ orig fx binary-op (a b (... ...)) check)
(define-an-fx+rest orig fx check (define-an-fx+rest orig fx binary-op check
([(a) (t1)] ([(a) (t1)]
[(a b) (t1 t2)] [(a b) (t1 t2)]
[(a b c) (t1 t2 t3)]))] [(a b c) (t1 t2 t3)]))]
[(_ orig fx (a) check) [(_ orig fx binary-op (a) check)
(define-an-fx+rest orig fx check (define-an-fx+rest orig fx binary-op check
([(a) (t1)]))] ([(a) (t1)]))]
[(_ orig fx (a b) check) [(_ orig fx binary-op (a b) check)
(define-an-fx orig fx check (define-an-fx orig fx binary-op check
([(a b) (t1 t2)]))] ([(a b) (t1 t2)]))]
[(_ orig fx (a b c) check) [(_ orig fx binary-op (a b c) check)
(define-an-fx orig fx check (define-an-fx orig fx binary-op check
([(a b c) (t1 t2 t3)]))]))))) ([(a b c) (t1 t2 t3)]))])))))

View File

@ -36,24 +36,24 @@
(define-inliner define-fx fixnum? "fixnum") (define-inliner define-fx fixnum? "fixnum")
(define-fx = fx=? (a b c ...) nocheck) (define-fx = fx=? #f (a b c ...) nocheck)
(define-fx > fx>? (a b c ...) nocheck) (define-fx > fx>? #f (a b c ...) nocheck)
(define-fx < fx<? (a b c ...) nocheck) (define-fx < fx<? #f (a b c ...) nocheck)
(define-fx <= fx<=? (a b c ...) nocheck) (define-fx <= fx<=? #f (a b c ...) nocheck)
(define-fx >= fx>=? (a b c ...) nocheck) (define-fx >= fx>=? #f (a b c ...) nocheck)
(define-fx zero? fxzero? (a) nocheck) (define-fx zero? fxzero? #f (a) nocheck)
(define-fx positive? fxpositive? (a) nocheck) (define-fx positive? fxpositive? #f (a) nocheck)
(define-fx negative? fxnegative? (a) nocheck) (define-fx negative? fxnegative? #f (a) nocheck)
(define-fx odd? fxodd? (a) nocheck) (define-fx odd? fxodd? #f (a) nocheck)
(define-fx even? fxeven? (a) nocheck) (define-fx even? fxeven? #f (a) nocheck)
(define-fx max fxmax (a b ...) nocheck) (define-fx max fxmax #f (a b ...) nocheck)
(define-fx min fxmin (a b ...) nocheck) (define-fx min fxmin #f (a b ...) nocheck)
(define-fx + fx+ (a b) check) (define-fx + fx+ #f (a b) check)
(define-fx * fx* (a b) check) (define-fx * fx* #f (a b) check)
(define-fx - fx- [(a) (a b)] check) (define-fx - fx- #f [(a) (a b)] check)
(provide fxdiv-and-mod (provide fxdiv-and-mod
fxdiv0-and-mod0) fxdiv0-and-mod0)
@ -65,8 +65,8 @@
(let-values ([(d m) (div-and-mod a b)]) (let-values ([(d m) (div-and-mod a b)])
(check d (implementation-restriction 'div-and-mod d)) (check d (implementation-restriction 'div-and-mod d))
(values d m))) (values d m)))
(define-fx div fxdiv (a b) check) (define-fx div fxdiv #f (a b) check)
(define-fx mod fxmod (a b) nocheck) (define-fx mod fxmod #f (a b) nocheck)
(define (fxdiv0-and-mod0 a b) (define (fxdiv0-and-mod0 a b)
(unless (fixnum? a) (unless (fixnum? a)
(raise-type-error 'fxdiv0-and-mod0 "fixnum" a)) (raise-type-error 'fxdiv0-and-mod0 "fixnum" a))
@ -75,8 +75,8 @@
(let-values ([(d m) (div0-and-mod0 a b)]) (let-values ([(d m) (div0-and-mod0 a b)])
(check d (implementation-restriction 'div0-and-mod0 d)) (check d (implementation-restriction 'div0-and-mod0 d))
(values d m))) (values d m)))
(define-fx div0 fxdiv0 (a b) check) (define-fx div0 fxdiv0 #f (a b) check)
(define-fx mod0 fxmod0 (a b) nocheck) (define-fx mod0 fxmod0 #f (a b) nocheck)
(define-syntax-rule (define-carry fx/carry (a b c) expr) (define-syntax-rule (define-carry fx/carry (a b c) expr)
(begin (begin
@ -96,18 +96,18 @@
(define-carry fx-/carry (a b c) (- a b c)) (define-carry fx-/carry (a b c) (- a b c))
(define-carry fx*/carry (a b c) (+ (* a b) c)) (define-carry fx*/carry (a b c) (+ (* a b) c))
(define-fx bitwise-not fxnot (a) nocheck) (define-fx bitwise-not fxnot #f (a) nocheck)
(define-fx bitwise-and fxand (a b ...) nocheck) (define-fx bitwise-and fxand #f (a b ...) nocheck)
(define-fx bitwise-ior fxior (a b ...) nocheck) (define-fx bitwise-ior fxior #f (a b ...) nocheck)
(define-fx bitwise-xor fxxor (a b ...) nocheck) (define-fx bitwise-xor fxxor #f (a b ...) nocheck)
(define-syntax-rule (fixnum-bitwise-if a b c) (define-syntax-rule (fixnum-bitwise-if a b c)
(bitwise-ior (bitwise-and a b) (bitwise-ior (bitwise-and a b)
(bitwise-and (bitwise-not a) c))) (bitwise-and (bitwise-not a) c)))
(define-fx fixnum-bitwise-if fxif (a b c) nocheck) (define-fx fixnum-bitwise-if fxif #f (a b c) nocheck)
(define-fx bitwise-length fxlength (a) nocheck) (define-fx bitwise-length fxlength #f (a) nocheck)
(define-fx bitwise-first-bit-set fxfirst-bit-set (a) nocheck) (define-fx bitwise-first-bit-set fxfirst-bit-set #f (a) nocheck)
(define positive-fixnum-width-bounds (define positive-fixnum-width-bounds
(string-append "exact integer in [0, " (number->string (- (fixnum-width) 1)) "]")) (string-append "exact integer in [0, " (number->string (- (fixnum-width) 1)) "]"))

View File

@ -5,17 +5,17 @@
div0-and-mod0 div0 mod0 div0-and-mod0 div0 mod0
[integer? r6rs:integer?] [integer? r6rs:integer?]
finite? infinite? nan?) finite? infinite? nan?)
(prefix-in core: scheme/flonum)
(only-in rnrs/arithmetic/fixnums-6 (only-in rnrs/arithmetic/fixnums-6
fixnum?) fixnum?)
rnrs/conditions-6 rnrs/conditions-6
r6rs/private/num-inline r6rs/private/num-inline)
(for-syntax r6rs/private/inline-rules))
(provide (rename-out [inexact-real? flonum?]) (provide (rename-out [inexact-real? flonum?])
real->flonum real->flonum
flnumerator flnumerator
fldenominator fldenominator
fllog flsqrt flexpt fllog (rename-out [core:flsqrt flsqrt]) flexpt
&no-infinities make-no-infinities-violation no-infinities-violation? &no-infinities make-no-infinities-violation no-infinities-violation?
&no-nans make-no-nans-violation no-nans-violation? &no-nans make-no-nans-violation no-nans-violation?
fixnum->flonum) fixnum->flonum)
@ -23,31 +23,31 @@
(define-inliner define-fl inexact-real? "flonum") (define-inliner define-fl inexact-real? "flonum")
(define-fl = fl=? (a b c ...) nocheck) (define-fl = fl=? core:fl= (a b c ...) nocheck)
(define-fl > fl>? (a b c ...) nocheck) (define-fl > fl>? core:fl> (a b c ...) nocheck)
(define-fl < fl<? (a b c ...) nocheck) (define-fl < fl<? core:fl< (a b c ...) nocheck)
(define-fl <= fl<=? (a b c ...) nocheck) (define-fl <= fl<=? core:fl<= (a b c ...) nocheck)
(define-fl >= fl>=? (a b c ...) nocheck) (define-fl >= fl>=? core:fl>= (a b c ...) nocheck)
(define-fl integer? flinteger? (a) nocheck) (define-fl integer? flinteger? #f (a) nocheck)
(define-fl zero? flzero? (a) nocheck) (define-fl zero? flzero? #f (a) nocheck)
(define-fl positive? flpositive? (a) nocheck) (define-fl positive? flpositive? #f (a) nocheck)
(define-fl negative? flnegative? (a) nocheck) (define-fl negative? flnegative? #f (a) nocheck)
(define-fl odd? flodd? (a) nocheck) (define-fl odd? flodd? #f (a) nocheck)
(define-fl even? fleven? (a) nocheck) (define-fl even? fleven? #f (a) nocheck)
(define-fl finite? flfinite? (a) nocheck) (define-fl finite? flfinite? #f (a) nocheck)
(define-fl infinite? flinfinite? (a) nocheck) (define-fl infinite? flinfinite? #f (a) nocheck)
(define-fl nan? flnan? (a) nocheck) (define-fl nan? flnan? #f (a) nocheck)
(define-fl max flmax (a b ...) nocheck) (define-fl max flmax #f (a b ...) nocheck)
(define-fl min flmin (a b ...) nocheck) (define-fl min flmin #f (a b ...) nocheck)
(define-fl + fl+ (a b ...) nocheck) (define-fl + fl+ core:fl+ (a b ...) nocheck)
(define-fl * fl* (a b ...) nocheck) (define-fl * fl* core:fl* (a b ...) nocheck)
(define-fl - fl- [(a) (a b ...)] nocheck) (define-fl - fl- core:fl- [(a) (a b ...)] nocheck)
(define-fl / fl/ [(a) (a b ...)] nocheck) (define-fl / fl/ core:fl/ [(a) (a b ...)] nocheck)
(define-fl abs flabs (a) nocheck) (define-fl abs flabs core:flabs (a) nocheck)
(provide fldiv-and-mod (provide fldiv-and-mod
fldiv0-and-mod0) fldiv0-and-mod0)
@ -57,16 +57,16 @@
(unless (inexact-real? b) (unless (inexact-real? b)
(raise-type-error 'fldiv-and-mod "flonum" b)) (raise-type-error 'fldiv-and-mod "flonum" b))
(div-and-mod a b)) (div-and-mod a b))
(define-fl div fldiv (a b) nocheck) (define-fl div fldiv #f (a b) nocheck)
(define-fl mod flmod (a b) nocheck) (define-fl mod flmod #f (a b) nocheck)
(define (fldiv0-and-mod0 a b) (define (fldiv0-and-mod0 a b)
(unless (inexact-real? a) (unless (inexact-real? a)
(raise-type-error 'fldiv0-and-mod0 "flonum" a)) (raise-type-error 'fldiv0-and-mod0 "flonum" a))
(unless (inexact-real? b) (unless (inexact-real? b)
(raise-type-error 'fldiv0-and-mod0 "flonum" b)) (raise-type-error 'fldiv0-and-mod0 "flonum" b))
(div0-and-mod0 a b)) (div0-and-mod0 a b))
(define-fl div0 fldiv0 (a b) nocheck) (define-fl div0 fldiv0 #f (a b) nocheck)
(define-fl mod0 flmod0 (a b) nocheck) (define-fl mod0 flmod0 #f (a b) nocheck)
(define (flnumerator c) (define (flnumerator c)
(if (inexact-real? c) (if (inexact-real? c)
@ -83,12 +83,12 @@
1.0) 1.0)
(raise-type-error 'fldenominator "flonum" c))) (raise-type-error 'fldenominator "flonum" c)))
(define-fl floor flfloor (a) nocheck) (define-fl floor flfloor #f (a) nocheck)
(define-fl ceiling flceiling (a) nocheck) (define-fl ceiling flceiling #f (a) nocheck)
(define-fl truncate fltruncate (a) nocheck) (define-fl truncate fltruncate #f (a) nocheck)
(define-fl round flround (a) nocheck) (define-fl round flround #f (a) nocheck)
(define-fl exp flexp (a) nocheck) (define-fl exp flexp #f (a) nocheck)
(define fllog (define fllog
(case-lambda (case-lambda
@ -102,20 +102,12 @@
[(v1 v2) [(v1 v2)
(/ (fllog v1) (fllog v2))])) (/ (fllog v1) (fllog v2))]))
(define-fl sin flsin (a) nocheck) (define-fl sin flsin #f (a) nocheck)
(define-fl cos flcos (a) nocheck) (define-fl cos flcos #f (a) nocheck)
(define-fl tan fltan (a) nocheck) (define-fl tan fltan #f (a) nocheck)
(define-fl asin flasin (a) nocheck) (define-fl asin flasin #f (a) nocheck)
(define-fl acos flacos (a) nocheck) (define-fl acos flacos #f (a) nocheck)
(define-fl atan flatan [(a) (a b)] nocheck) (define-fl atan flatan #f [(a) (a b)] nocheck)
(define (flsqrt v)
(unless (inexact-real? v)
(raise-type-error 'flsqrt "flonum" v))
(let ([v (sqrt v)])
(if (inexact-real? v)
v
+nan.0)))
(define (flexpt a b) (define (flexpt a b)
(unless (inexact-real? a) (unless (inexact-real? a)

View File

@ -0,0 +1,4 @@
#lang scheme/base
(require '#%flonum)
(provide (all-from-out '#%flonum))

View File

@ -1,7 +1,7 @@
#lang scribble/doc #lang scribble/doc
@(require scribble/manual @(require scribble/manual
"guide-utils.ss" "guide-utils.ss"
(for-label scheme/unsafe/ops)) (for-label scheme/flonum scheme/unsafe/ops))
@title[#:tag "performance"]{Performance} @title[#:tag "performance"]{Performance}
@ -257,30 +257,35 @@ arguments, such as @scheme[+], inlining works for two or more
arguments (except for @scheme[-], whose one-argument case is also arguments (except for @scheme[-], whose one-argument case is also
inlined) when the arguments are either all fixnums or all flonums. inlined) when the arguments are either all fixnums or all flonums.
Flonums are @defterm{boxed}, which means that memory is allocated to Flonums are typically @defterm{boxed}, which means that memory is
hold every result of a flonum computation. Fortunately, the allocated to hold every result of a flonum computation. Fortunately,
generational garbage collector (described later in @secref["gc-perf"]) the generational garbage collector (described later in
makes allocation for short-lived results reasonably cheap. Fixnums, in @secref["gc-perf"]) makes allocation for short-lived results
contrast are never boxed, so they are especially cheap to use. reasonably cheap. Fixnums, in contrast are never boxed, so they are
typically cheap to use.
The @schememodname[scheme/unsafe/ops] library provides fixnum- and The @schememodname[scheme/flonum] library provides flonum-specific
flonum-specific operations, and combinations of unchecked flonum operations, and combinations of flonum operations allow the @tech{JIT}
operations allow the @tech{JIT} compiler to generate code that avoids compiler to generate code that avoids boxing and unboxing intermediate
boxing and unboxing intermediate results. Expressions involving a results. Besides results within immediate combinations,
combination of unchecked flonum operations, @scheme[unsafe-fx->fl], flonum-specific results that are bound with @scheme[let] and consumed
constants, and variable references are optimized to avoid boxing. When by a later flonum-specific operation are unboxed within temporary
such a result is bound with @scheme[let] and then consumed by another storage. Finally, the compiler can detect some flonum-valued loop
unchecked flonum operation, the result is similarly unboxed. Finally, accumulators and avoid boxing of the accumulator. The bytecode
the compiler can detect some flonum-valued loop accumulators. The decompiler (see @secref[#:doc '(lib "scribblings/mzc/mzc.scrbl")
bytecode decompiler (see @secref[#:doc '(lib "decompile"]) annotates combinations where the JIT can avoid boxes with
"scribblings/mzc/mzc.scrbl") "decompile"] annotates combinations where @schemeidfont{#%flonum}, @schemeidfont{#%as-flonum}, and
the JIT can avoid boxes with @schemeidfont{#%flonum}, @schemeidfont{#%from-flonum}.
@schemeidfont{#%as-flonum}, and @schemeidfont{#%from-flonum}. See also
@secref["unchecked-unsafe"], especially the warnings about unsafety.
@margin-note{Unboxing of local bindings and accumualtors is not @margin-note{Unboxing of local bindings and accumualtors is not
supported by the JIT for PowerPC.} supported by the JIT for PowerPC.}
The @schememodname[scheme/unsafe/ops] library provides unchecked
fixnum- and flonum-specific operations. Unchecked flonum-specific
operations allow unboxing, and sometimes they allow the compiler to
reorder expressions to improve performance. See also
@secref["unchecked-unsafe"], especially the warnings about unsafety.
@; ---------------------------------------------------------------------- @; ----------------------------------------------------------------------
@section[#:tag "unchecked-unsafe"]{Unchecked, Unsafe Operations} @section[#:tag "unchecked-unsafe"]{Unchecked, Unsafe Operations}

View File

@ -81,11 +81,11 @@ Many forms in the decompiled code, such as @scheme[module],
inline the operation. (Inlining information is not part of the inline the operation. (Inlining information is not part of the
bytecode, but is instead based on an enumeration of primitives that bytecode, but is instead based on an enumeration of primitives that
the JIT is known to handle specially.) Operations from the JIT is known to handle specially.) Operations from
@schememodname[scheme/unsafe/ops] are always inlined, so @schememodname[scheme/flonum] and @schememodname[scheme/unsafe/ops]
@schemeidfont{#%in} is not shown for them.} are always inlined, so @schemeidfont{#%in} is not shown for them.}
@item{Some applications of unsafe flonum operations from @item{Some applications of flonum operations from @schememodname[scheme/flonum]
@schememodname[scheme/unsafe/ops] are annotated with and @schememodname[scheme/unsafe/ops] are annotated with
@schemeidfont{#%flonum}, indicating a place where the JIT compiler @schemeidfont{#%flonum}, indicating a place where the JIT compiler
might avoid allocation for intermediate flonum results. A single might avoid allocation for intermediate flonum results. A single
@schemeidfont{#%flonum} by itself is not useful, but a @schemeidfont{#%flonum} by itself is not useful, but a

View File

@ -1,7 +1,8 @@
#lang scribble/doc #lang scribble/doc
@(require "mz.ss" @(require "mz.ss"
scheme/math scheme/math
(for-label scheme/math)) (for-label scheme/math
scheme/flonum))
@(define math-eval (make-base-eval)) @(define math-eval (make-base-eval))
@(interaction-eval #:eval math-eval (require scheme/math)) @(interaction-eval #:eval math-eval (require scheme/math))
@ -850,7 +851,51 @@ for the machine running Scheme, @scheme[#f] if the native encoding
is little-endian.} is little-endian.}
@; ------------------------------------------------------------------------ @; ------------------------------------------------------------------------
@section{Inexact-Real Vectors} @section{Inexact-Real (Flonum) Operations}
@defmodule[scheme/flonum]
The @schememodname[scheme/flonum] library provides operations like
@scheme[fl+] that consume and produce only real @tech{inexact
numbers}, which are also known as @deftech{flonums}. Flonum-specific
operations provide can better performance when used consistently, and
they are as safe as generic operations like @scheme[+].
@margin-note{See @guidesecref["fixnums+flonums"].}
@subsection{Flonum Arithmetic}
@deftogether[(
@defproc[(fl+ [a inexact-real?][b inexact-real?]) inexact-real?]
@defproc[(fl- [a inexact-real?][b inexact-real?]) inexact-real?]
@defproc[(fl* [a inexact-real?][b inexact-real?]) inexact-real?]
@defproc[(fl/ [a inexact-real?][b inexact-real?]) inexact-real?]
@defproc[(flabs [a inexact-real?]) inexact-real?]
@defproc[(flsqrt [a inexact-real?]) inexact-real?]
)]{
Like @scheme[+], @scheme[-], @scheme[*], @scheme[/], @scheme[abs], and
@scheme[sqrt], but constrained to consume @tech{flonums}. The result
is always a @tech{flonum}. If a negative number is provided to
@scheme[sqrt], the result is @scheme[+nan.0].}
@deftogether[(
@defproc[(fl= [a inexact-real?][b inexact-real?]) boolean?]
@defproc[(fl< [a inexact-real?][b inexact-real?]) boolean?]
@defproc[(fl> [a inexact-real?][b inexact-real?]) boolean?]
@defproc[(fl<= [a inexact-real?][b inexact-real?]) boolean?]
@defproc[(fl>= [a inexact-real?][b inexact-real?]) boolean?]
)]{
Like @scheme[=], @scheme[<], @scheme[>], @scheme[<=], and @scheme[>=],
but constrained to consume @tech{flonums}.}
@defproc[(->fl [a exact-integer?]) inexact-real?]{
Like @scheme[exact->inexact], but constrained to consume exact integers,
so the result is always a @tech{flonum}.
}
@subsection{Flonum Vectors}
A @deftech{flvector} is like a @tech{vector}, but it holds only A @deftech{flvector} is like a @tech{vector}, but it holds only
inexact real numbers. This representation can be more compact, and inexact real numbers. This representation can be more compact, and

View File

@ -1,6 +1,7 @@
#lang scribble/doc #lang scribble/doc
@(require "mz.ss" @(require "mz.ss"
(for-label scheme/unsafe/ops (for-label scheme/unsafe/ops
scheme/flonum
(only-in scheme/foreign (only-in scheme/foreign
f64vector? f64vector?
f64vector-ref f64vector-ref
@ -85,7 +86,7 @@ For @tech{fixnums}: Like @scheme[=], @scheme[<], @scheme[>],
@defproc[(unsafe-fx->fl [a fixnum?]) inexact-real?]{ @defproc[(unsafe-fx->fl [a fixnum?]) inexact-real?]{
Like @scheme[exact->inexact], but constrained to consume @tech{fixnums}. Unchecked version of @scheme[->fl].
} }
@ -98,11 +99,8 @@ Like @scheme[exact->inexact], but constrained to consume @tech{fixnums}.
@defproc[(unsafe-flsqrt [a inexact-real?]) inexact-real?] @defproc[(unsafe-flsqrt [a inexact-real?]) inexact-real?]
)]{ )]{
For real @tech{inexact numbers}: Like @scheme[+], @scheme[-], For @tech{flonums}: Unchecked versions of @scheme[fl+], @scheme[fl-],
@scheme[*], @scheme[/], and @scheme[abs], but constrained to consume @scheme[fl*], @scheme[fl/], @scheme[flabs], and @scheme[flsqrt].}
real @tech{inexact numbers}. The result is always a real @tech{inexact
number}. If a negative number is provided to @scheme[unsafe-sqrt], the
result is @scheme[+nan.0].}
@deftogether[( @deftogether[(
@ -113,9 +111,9 @@ result is @scheme[+nan.0].}
@defproc[(unsafe-fl>= [a inexact-real?][b inexact-real?]) boolean?] @defproc[(unsafe-fl>= [a inexact-real?][b inexact-real?]) boolean?]
)]{ )]{
For real @tech{inexact numbers}: Like @scheme[=], @scheme[<], For @tech{flonums}: Unchecked versions of @scheme[fl=],
@scheme[>], @scheme[<=], and @scheme[>=], but constrained to consume @scheme[fl<], @scheme[fl>], @scheme[fl<=], and @scheme[fl>=], but constrained
real @tech{inexact numbers}.} to consume @tech{flonums}.}
@section{Unsafe Data Extraction} @section{Unsafe Data Extraction}

View File

@ -0,0 +1,79 @@
;; ---------------------------------------------------------------------
;; The Great Computer Language Shootout
;; http://shootout.alioth.debian.org/
;;
;; Derived from the Chicken variant, which was
;; Contributed by Anthony Borla
;; The version that uses complex number is a little
;; more elegant, but much slower:
;; (define (mandelbrot iterations x y n ci)
;; (let ((c (+ (- (/ (* 2.0 x) n) 1.5)
;; (* ci 0.0+1.0i))))
;; (let loop ((i 0) (z 0.0+0.0i))
;; (cond
;; [(> i iterations) 1]
;; [(> (magnitude z) 2.0) 0]
;; [else (loop (add1 i) (+ (* z z) c))]))))
#lang scheme/base
(require scheme/cmdline)
(define +limit-sqr+ 4.0)
(define +iterations+ 50)
;; -------------------------------
(define (mandelbrot iterations x y n ci)
(let ((cr (- (/ (* 2.0 x) n) 1.5)))
(let loop ((i 0) (zr 0.0) (zi 0.0))
(if (> i iterations)
1
(let ((zrq (* zr zr))
(ziq (* zi zi)))
(cond
((> (+ zrq ziq) +limit-sqr+) 0)
(else (loop (add1 i)
(+ (- zrq ziq) cr)
(+ (* 2.0 zr zi) ci)))))))))
;; -------------------------------
(define (main n)
(let ((out (current-output-port)))
(fprintf out "P4\n~a ~a\n" n n)
(let loop-y ((y 0))
(when (< y n)
(let ([ci (- (/ (* 2.0 y) n) 1.0)])
(let loop-x ((x 0) (bitnum 0) (byteacc 0))
(if (< x n)
(let ([bitnum (add1 bitnum)]
[byteacc (+ (arithmetic-shift byteacc 1)
(mandelbrot +iterations+ x y n ci))])
(cond
((= bitnum 8)
(write-byte byteacc out)
(loop-x (add1 x) 0 0))
[else (loop-x (add1 x) bitnum byteacc)]))
(begin
(when (positive? bitnum)
(write-byte (arithmetic-shift byteacc
(- 8 (bitwise-and n #x7)))
out))
(loop-y (add1 y))))))))))
;; -------------------------------
(command-line #:args (n)
(main (string->number n)))

View File

@ -5,19 +5,9 @@
;; Derived from the Chicken variant, which was ;; Derived from the Chicken variant, which was
;; Contributed by Anthony Borla ;; Contributed by Anthony Borla
;; The version that uses complex number is a little
;; more elegant, but much slower:
;; (define (mandelbrot iterations x y n ci)
;; (let ((c (+ (- (/ (* 2.0 x) n) 1.5)
;; (* ci 0.0+1.0i))))
;; (let loop ((i 0) (z 0.0+0.0i))
;; (cond
;; [(> i iterations) 1]
;; [(> (magnitude z) 2.0) 0]
;; [else (loop (add1 i) (+ (* z z) c))]))))
#lang scheme/base #lang scheme/base
(require scheme/cmdline) (require scheme/cmdline
scheme/flonum)
(define +limit-sqr+ 4.0) (define +limit-sqr+ 4.0)
@ -25,18 +15,16 @@
;; ------------------------------- ;; -------------------------------
(define (mandelbrot iterations x y n ci) (define (mandelbrot x y n ci)
(let ((cr (- (/ (* 2.0 x) n) 1.5))) (let ((cr (fl- (fl/ (fl* 2.0 (->fl x)) (->fl n)) 1.5)))
(let loop ((i 0) (zr 0.0) (zi 0.0)) (let loop ((i 0) (zr 0.0) (zi 0.0))
(if (> i iterations) (if (> i +iterations+)
1 1
(let ((zrq (* zr zr))
(ziq (* zi zi)))
(cond (cond
((> (+ zrq ziq) +limit-sqr+) 0) ((fl> (fl+ (fl* zr zr) (fl* zi zi)) +limit-sqr+) 0)
(else (loop (add1 i) (else (loop (+ 1 i)
(+ (- zrq ziq) cr) (fl+ (fl- (fl* zr zr) (fl* zi zi)) cr)
(+ (* 2.0 zr zi) ci))))))))) (fl+ (fl* 2.0 (fl* zr zi)) ci))))))))
;; ------------------------------- ;; -------------------------------
@ -49,21 +37,21 @@
(when (< y n) (when (< y n)
(let ([ci (- (/ (* 2.0 y) n) 1.0)]) (let ([ci (fl- (fl/ (fl* 2.0 (->fl y)) (->fl n)) 1.0)])
(let loop-x ((x 0) (bitnum 0) (byteacc 0)) (let loop-x ((x 0) (bitnum 0) (byteacc 0))
(if (< x n) (if (< x n)
(let ([bitnum (add1 bitnum)] (let ([bitnum (+ 1 bitnum)]
[byteacc (+ (arithmetic-shift byteacc 1) [byteacc (+ (arithmetic-shift byteacc 1)
(mandelbrot +iterations+ x y n ci))]) (mandelbrot x y n ci))])
(cond (cond
((= bitnum 8) ((= bitnum 8)
(write-byte byteacc out) (write-byte byteacc out)
(loop-x (add1 x) 0 0)) (loop-x (+ 1 x) 0 0))
[else (loop-x (add1 x) bitnum byteacc)])) [else (loop-x (+ 1 x) bitnum byteacc)]))
(begin (begin
(when (positive? bitnum) (when (positive? bitnum)

View File

@ -0,0 +1,157 @@
#!/usr/bin/mzscheme -qu
;; The Computer Language Benchmarks Game
;; http://shootout.alioth.debian.org/
;;
;; Imperative-style implementation based on the SBCL implementation by
;; Patrick Frankenberger and Juho Snellman, but using only native Scheme
;; idioms like 'named let' and 'do' special form.
;;
;; Contributed by Anthony Borla, then converted for mzscheme
;; by Matthew Flatt and Brent Fulgham
#|
Correct output N = 1000 is
-0.169075164
-0.169087605
|#
#lang scheme/base
(require scheme/cmdline)
;; ------------------------------
;; define planetary masses, initial positions & velocity
(define +pi+ 3.141592653589793)
(define +days-per-year+ 365.24)
(define +solar-mass+ (* 4 +pi+ +pi+))
(define +dt+ 0.01)
(define-struct body (x y z vx vy vz mass)
#:mutable)
(define *sun*
(make-body 0.0 0.0 0.0 0.0 0.0 0.0 +solar-mass+))
(define *jupiter*
(make-body 4.84143144246472090
-1.16032004402742839
-1.03622044471123109e-1
(* 1.66007664274403694e-3 +days-per-year+)
(* 7.69901118419740425e-3 +days-per-year+)
(* -6.90460016972063023e-5 +days-per-year+)
(* 9.54791938424326609e-4 +solar-mass+)))
(define *saturn*
(make-body 8.34336671824457987
4.12479856412430479
-4.03523417114321381e-1
(* -2.76742510726862411e-3 +days-per-year+)
(* 4.99852801234917238e-3 +days-per-year+)
(* 2.30417297573763929e-5 +days-per-year+)
(* 2.85885980666130812e-4 +solar-mass+)))
(define *uranus*
(make-body 1.28943695621391310e1
-1.51111514016986312e1
-2.23307578892655734e-1
(* 2.96460137564761618e-03 +days-per-year+)
(* 2.37847173959480950e-03 +days-per-year+)
(* -2.96589568540237556e-05 +days-per-year+)
(* 4.36624404335156298e-05 +solar-mass+)))
(define *neptune*
(make-body 1.53796971148509165e+01
-2.59193146099879641e+01
1.79258772950371181e-01
(* 2.68067772490389322e-03 +days-per-year+)
(* 1.62824170038242295e-03 +days-per-year+)
(* -9.51592254519715870e-05 +days-per-year+)
(* 5.15138902046611451e-05 +solar-mass+)))
(define *system* (list *sun* *jupiter* *saturn* *uranus* *neptune*))
;; -------------------------------
(define (offset-momentum)
(let loop-i ([i *system*] [px 0.0] [py 0.0] [pz 0.0])
(if (null? i)
(begin
(set-body-vx! (car *system*) (/ (- px) +solar-mass+))
(set-body-vy! (car *system*) (/ (- py) +solar-mass+))
(set-body-vz! (car *system*) (/ (- pz) +solar-mass+)))
(let ([i1 (car i)])
(loop-i (cdr i)
(+ px (* (body-vx i1) (body-mass i1)))
(+ py (* (body-vy i1) (body-mass i1)))
(+ pz (* (body-vz i1) (body-mass i1))))))))
;; -------------------------------
(define (energy)
(let loop-o ([o *system*] [e 0.0])
(if (null? o)
e
(let* ([o1 (car o)]
[e (+ e (* 0.5
(body-mass o1)
(+ (* (body-vx o1) (body-vx o1))
(* (body-vy o1) (body-vy o1))
(* (body-vz o1) (body-vz o1)))))])
(let loop-i ([i (cdr o)] [e e])
(if (null? i)
(loop-o (cdr o) e)
(let* ([i1 (car i)]
[dx (- (body-x o1) (body-x i1))]
[dy (- (body-y o1) (body-y i1))]
[dz (- (body-z o1) (body-z i1))]
[dist (sqrt (+ (* dx dx) (* dy dy) (* dz dz)))]
[e (- e (/ (* (body-mass o1) (body-mass i1)) dist))])
(loop-i (cdr i) e))))))))
;; -------------------------------
(define (advance)
(let loop-o ([o *system*])
(when (pair? o)
(let* ([o1 (car o)]
[o1x (body-x o1)]
[o1y (body-y o1)]
[o1z (body-z o1)]
[om (body-mass o1)])
(let loop-i ([i (cdr o)]
[vx (body-vx o1)]
[vy (body-vy o1)]
[vz (body-vz o1)])
(if (pair? i)
(let* ([i1 (car i)]
[dx (- o1x (body-x i1))]
[dy (- o1y (body-y i1))]
[dz (- o1z (body-z i1))]
[dist2 (+ (* dx dx) (* dy dy) (* dz dz))]
[mag (/ +dt+ (* dist2 (sqrt dist2)))]
[dxmag (* dx mag)]
[dymag (* dy mag)]
[dzmag (* dz mag)]
[im (body-mass i1)])
(set-body-vx! i1 (+ (body-vx i1) (* dxmag om)))
(set-body-vy! i1 (+ (body-vy i1) (* dymag om)))
(set-body-vz! i1 (+ (body-vz i1) (* dzmag om)))
(loop-i (cdr i)
(- vx (* dxmag im))
(- vy (* dymag im))
(- vz (* dzmag im))))
(begin (set-body-vx! o1 vx)
(set-body-vy! o1 vy)
(set-body-vz! o1 vz)
(set-body-x! o1 (+ o1x (* +dt+ vx)))
(set-body-y! o1 (+ o1y (* +dt+ vy)))
(set-body-z! o1 (+ o1z (* +dt+ vz)))))))
(loop-o (cdr o)))))
;; -------------------------------
(let ([n (command-line #:args (n) (string->number n))])
(offset-momentum)
(printf "~a\n" (real->decimal-string (energy) 9))
(for ([i (in-range n)]) (advance))
(printf "~a\n" (real->decimal-string (energy) 9)))

View File

@ -18,6 +18,7 @@ Correct output N = 1000 is
#lang scheme/base #lang scheme/base
(require scheme/cmdline scheme/require (require scheme/cmdline scheme/require
(only-in scheme/flonum flvector)
(for-syntax scheme/base) (for-syntax scheme/base)
(filtered-in (filtered-in
(lambda (name) (lambda (name)

View File

@ -17,7 +17,8 @@ Correct output N = 1000 is
|# |#
#lang scheme/base #lang scheme/base
(require scheme/cmdline) (require scheme/cmdline
scheme/flonum)
;; ------------------------------ ;; ------------------------------
;; define planetary masses, initial positions & velocity ;; define planetary masses, initial positions & velocity
@ -93,20 +94,20 @@ Correct output N = 1000 is
(if (null? o) (if (null? o)
e e
(let* ([o1 (car o)] (let* ([o1 (car o)]
[e (+ e (* 0.5 [e (+ e (fl* 0.5
(body-mass o1) (fl* (body-mass o1)
(+ (* (body-vx o1) (body-vx o1)) (fl+ (fl+ (fl* (body-vx o1) (body-vx o1))
(* (body-vy o1) (body-vy o1)) (fl* (body-vy o1) (body-vy o1)))
(* (body-vz o1) (body-vz o1)))))]) (fl* (body-vz o1) (body-vz o1))))))])
(let loop-i ([i (cdr o)] [e e]) (let loop-i ([i (cdr o)] [e e])
(if (null? i) (if (null? i)
(loop-o (cdr o) e) (loop-o (cdr o) e)
(let* ([i1 (car i)] (let* ([i1 (car i)]
[dx (- (body-x o1) (body-x i1))] [dx (fl- (body-x o1) (body-x i1))]
[dy (- (body-y o1) (body-y i1))] [dy (fl- (body-y o1) (body-y i1))]
[dz (- (body-z o1) (body-z i1))] [dz (fl- (body-z o1) (body-z i1))]
[dist (sqrt (+ (* dx dx) (* dy dy) (* dz dz)))] [dist (flsqrt (fl+ (fl+ (fl* dx dx) (fl* dy dy)) (fl* dz dz)))]
[e (- e (/ (* (body-mass o1) (body-mass i1)) dist))]) [e (fl- e (fl/ (fl* (body-mass o1) (body-mass i1)) dist))])
(loop-i (cdr i) e)))))))) (loop-i (cdr i) e))))))))
;; ------------------------------- ;; -------------------------------
@ -124,28 +125,28 @@ Correct output N = 1000 is
[vz (body-vz o1)]) [vz (body-vz o1)])
(if (pair? i) (if (pair? i)
(let* ([i1 (car i)] (let* ([i1 (car i)]
[dx (- o1x (body-x i1))] [dx (fl- o1x (body-x i1))]
[dy (- o1y (body-y i1))] [dy (fl- o1y (body-y i1))]
[dz (- o1z (body-z i1))] [dz (fl- o1z (body-z i1))]
[dist2 (+ (* dx dx) (* dy dy) (* dz dz))] [dist2 (fl+ (fl+ (fl* dx dx) (fl* dy dy)) (fl* dz dz))]
[mag (/ +dt+ (* dist2 (sqrt dist2)))] [mag (fl/ +dt+ (fl* dist2 (flsqrt dist2)))]
[dxmag (* dx mag)] [dxmag (fl* dx mag)]
[dymag (* dy mag)] [dymag (fl* dy mag)]
[dzmag (* dz mag)] [dzmag (fl* dz mag)]
[im (body-mass i1)]) [im (body-mass i1)])
(set-body-vx! i1 (+ (body-vx i1) (* dxmag om))) (set-body-vx! i1 (fl+ (body-vx i1) (fl* dxmag om)))
(set-body-vy! i1 (+ (body-vy i1) (* dymag om))) (set-body-vy! i1 (fl+ (body-vy i1) (fl* dymag om)))
(set-body-vz! i1 (+ (body-vz i1) (* dzmag om))) (set-body-vz! i1 (fl+ (body-vz i1) (fl* dzmag om)))
(loop-i (cdr i) (loop-i (cdr i)
(- vx (* dxmag im)) (fl- vx (fl* dxmag im))
(- vy (* dymag im)) (fl- vy (fl* dymag im))
(- vz (* dzmag im)))) (fl- vz (fl* dzmag im))))
(begin (set-body-vx! o1 vx) (begin (set-body-vx! o1 vx)
(set-body-vy! o1 vy) (set-body-vy! o1 vy)
(set-body-vz! o1 vz) (set-body-vz! o1 vz)
(set-body-x! o1 (+ o1x (* +dt+ vx))) (set-body-x! o1 (fl+ o1x (fl* +dt+ vx)))
(set-body-y! o1 (+ o1y (* +dt+ vy))) (set-body-y! o1 (fl+ o1y (fl* +dt+ vy)))
(set-body-z! o1 (+ o1z (* +dt+ vz))))))) (set-body-z! o1 (fl+ o1z (fl* +dt+ vz)))))))
(loop-o (cdr o))))) (loop-o (cdr o)))))
;; ------------------------------- ;; -------------------------------

View File

@ -9,7 +9,8 @@
;; --------------------------------------------------------------------- ;; ---------------------------------------------------------------------
#lang scheme/base #lang scheme/base
(require scheme/cmdline) (require scheme/cmdline
scheme/flonum)
;; ------------------------------- ;; -------------------------------
@ -25,8 +26,8 @@
(else (+ (fib (- n 2)) (fib (- n 1)))))) (else (+ (fib (- n 2)) (fib (- n 1))))))
(define (fibflt n) (define (fibflt n)
(cond ((< n 2.0) 1.0) (cond ((fl< n 2.0) 1.0)
(else (+ (fibflt (- n 2.0)) (fibflt (- n 1.0)))))) (else (fl+ (fibflt (fl- n 2.0)) (fibflt (fl- n 1.0))))))
;; -------------- ;; --------------
@ -35,8 +36,8 @@
(else (tak (tak (- x 1) y z) (tak (- y 1) z x) (tak (- z 1) x y))))) (else (tak (tak (- x 1) y z) (tak (- y 1) z x) (tak (- z 1) x y)))))
(define (takflt x y z) (define (takflt x y z)
(cond ((not (< y x)) z) (cond ((not (fl< y x)) z)
(else (takflt (takflt (- x 1.0) y z) (takflt (- y 1.0) z x) (takflt (- z 1.0) x y))))) (else (takflt (takflt (fl- x 1.0) y z) (takflt (fl- y 1.0) z x) (takflt (fl- z 1.0) x y)))))
;; ------------------------------- ;; -------------------------------

View File

@ -0,0 +1,58 @@
;; The Great Computer Language Shootout
;; http://shootout.alioth.debian.org/
;; Translated directly from the C# version, which was:
;; contributed by Isaac Gouy
#lang scheme/base
(require scheme/cmdline)
(define (Approximate n)
(let ([u (make-vector n 1.0)]
[v (make-vector n 0.0)])
;; 20 steps of the power method
(for ([i (in-range 10)])
(MultiplyAtAv n u v)
(MultiplyAtAv n v u))
;; B=AtA A multiplied by A transposed
;; v.Bv /(v.v) eigenvalue of v
(let loop ([i 0][vBv 0][vv 0])
(if (= i n)
(sqrt (/ vBv vv))
(let ([vi (vector-ref v i)])
(loop (add1 i)
(+ vBv (* (vector-ref u i) vi))
(+ vv (* vi vi))))))))
;; return element i,j of infinite matrix A
(define (A i j)
(/ 1.0 (+ (* (+ i j) (/ (+ i (+ j 1)) 2.0)) (+ i 1))))
;; multiply vector v by matrix A
(define (MultiplyAv n v Av)
(for ([i (in-range n)])
(vector-set! Av i
(for/fold ([r 0])
([j (in-range n)])
(+ r (* (A i j) (vector-ref v j)))))))
;; multiply vector v by matrix A transposed
(define (MultiplyAtv n v Atv)
(for ([i (in-range n)])
(vector-set! Atv i
(for/fold ([r 0])
([j (in-range n)])
(+ r (* (A j i) (vector-ref v j)))))))
;; multiply vector v by matrix A and then by matrix A transposed
(define (MultiplyAtAv n v AtAv)
(let ([u (make-vector n 0.0)])
(MultiplyAv n v u)
(MultiplyAtv n u AtAv)))
(printf "~a\n"
(real->decimal-string
(Approximate (command-line #:args (n) (string->number n)))
9))

View File

@ -6,6 +6,7 @@
#lang scheme/base #lang scheme/base
(require scheme/cmdline (require scheme/cmdline
scheme/flonum
scheme/unsafe/ops) scheme/unsafe/ops)
(define (Approximate n) (define (Approximate n)

View File

@ -5,7 +5,8 @@
;; contributed by Isaac Gouy ;; contributed by Isaac Gouy
#lang scheme/base #lang scheme/base
(require scheme/cmdline) (require scheme/cmdline
scheme/flonum)
(define (Approximate n) (define (Approximate n)
(let ([u (make-vector n 1.0)] (let ([u (make-vector n 1.0)]
@ -17,33 +18,35 @@
;; B=AtA A multiplied by A transposed ;; B=AtA A multiplied by A transposed
;; v.Bv /(v.v) eigenvalue of v ;; v.Bv /(v.v) eigenvalue of v
(let loop ([i 0][vBv 0][vv 0]) (let loop ([i 0][vBv 0.0][vv 0.0])
(if (= i n) (if (= i n)
(sqrt (/ vBv vv)) (flsqrt (fl/ vBv vv))
(let ([vi (vector-ref v i)]) (let ([vi (vector-ref v i)])
(loop (add1 i) (loop (add1 i)
(+ vBv (* (vector-ref u i) vi)) (fl+ vBv (fl* (vector-ref u i) vi))
(+ vv (* vi vi)))))))) (fl+ vv (fl* vi vi))))))))
;; return element i,j of infinite matrix A ;; return element i,j of infinite matrix A
(define (A i j) (define (A i j)
(/ 1.0 (+ (* (+ i j) (/ (+ i (+ j 1)) 2.0)) (+ i 1)))) (fl/ 1.0 (fl+ (fl* (->fl (+ i j))
(fl/ (->fl (+ i (+ j 1))) 2.0))
(->fl (+ i 1)))))
;; multiply vector v by matrix A ;; multiply vector v by matrix A
(define (MultiplyAv n v Av) (define (MultiplyAv n v Av)
(for ([i (in-range n)]) (for ([i (in-range n)])
(vector-set! Av i (vector-set! Av i
(for/fold ([r 0]) (for/fold ([r 0.0])
([j (in-range n)]) ([j (in-range n)])
(+ r (* (A i j) (vector-ref v j))))))) (fl+ r (fl* (A i j) (vector-ref v j)))))))
;; multiply vector v by matrix A transposed ;; multiply vector v by matrix A transposed
(define (MultiplyAtv n v Atv) (define (MultiplyAtv n v Atv)
(for ([i (in-range n)]) (for ([i (in-range n)])
(vector-set! Atv i (vector-set! Atv i
(for/fold ([r 0]) (for/fold ([r 0.0])
([j (in-range n)]) ([j (in-range n)])
(+ r (* (A j i) (vector-ref v j))))))) (fl+ r (fl* (A j i) (vector-ref v j)))))))
;; multiply vector v by matrix A and then by matrix A transposed ;; multiply vector v by matrix A and then by matrix A transposed
(define (MultiplyAtAv n v AtAv) (define (MultiplyAtAv n v AtAv)

View File

@ -3,11 +3,14 @@
(Section 'optimization) (Section 'optimization)
(require scheme/flonum)
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Check JIT inlining of primitives: ;; Check JIT inlining of primitives:
(parameterize ([current-namespace (make-base-namespace)] (parameterize ([current-namespace (make-base-namespace)]
[eval-jit-enabled #t]) [eval-jit-enabled #t])
(namespace-require 'scheme/flonum)
(let* ([check-error-message (lambda (name proc) (let* ([check-error-message (lambda (name proc)
(unless (memq name '(eq? not null? pair? (unless (memq name '(eq? not null? pair?
real? number? boolean? real? number? boolean?
@ -215,6 +218,9 @@
(tri-if #t '< (lambda () 1) 2 3 void) (tri-if #t '< (lambda () 1) 2 3 void)
(tri-if #f '< (lambda () 1) 3 3 void) (tri-if #f '< (lambda () 1) 3 3 void)
(tri-if #f '< (lambda () 1) -1 3 void) (tri-if #f '< (lambda () 1) -1 3 void)
(bin-exact #t 'fl< 100.0 200.0)
(bin-exact #f 'fl< 200.0 100.0)
(bin-exact #f 'fl< 200.0 200.0)
(bin #t '<= 100 200) (bin #t '<= 100 200)
(bin #f '<= 200 100) (bin #f '<= 200 100)
@ -224,6 +230,9 @@
(tri-if #t '<= (lambda () 1) 2 3 void) (tri-if #t '<= (lambda () 1) 2 3 void)
(tri-if #t '<= (lambda () 1) 3 3 void) (tri-if #t '<= (lambda () 1) 3 3 void)
(tri-if #f '<= (lambda () 1) -1 3 void) (tri-if #f '<= (lambda () 1) -1 3 void)
(bin-exact #t 'fl<= 100.0 200.0)
(bin-exact #f 'fl<= 200.0 100.0)
(bin-exact #t 'fl<= 200.0 200.0)
(bin #f '> 100 200) (bin #f '> 100 200)
(bin #t '> 200 100) (bin #t '> 200 100)
@ -234,6 +243,9 @@
(tri-if #t '> (lambda () 3) 2 1 void) (tri-if #t '> (lambda () 3) 2 1 void)
(tri-if #f '> (lambda () 3) 3 1 void) (tri-if #f '> (lambda () 3) 3 1 void)
(tri-if #f '> (lambda () 3) -1 1 void) (tri-if #f '> (lambda () 3) -1 1 void)
(bin-exact #f 'fl> 100.0 200.0)
(bin-exact #t 'fl> 200.0 100.0)
(bin-exact #f 'fl> 200.0 200.0)
(bin #f '>= 100 200) (bin #f '>= 100 200)
(bin #t '>= 200 100) (bin #t '>= 200 100)
@ -243,6 +255,9 @@
(tri-if #t '>= (lambda () 3) 2 1 void) (tri-if #t '>= (lambda () 3) 2 1 void)
(tri-if #t '>= (lambda () 3) 3 1 void) (tri-if #t '>= (lambda () 3) 3 1 void)
(tri-if #f '>= (lambda () 3) -1 1 void) (tri-if #f '>= (lambda () 3) -1 1 void)
(bin-exact #f 'fl>= 100.0 200.0)
(bin-exact #t 'fl>= 200.0 100.0)
(bin-exact #t 'fl>= 200.0 200.0)
(bin #f '= 100 200) (bin #f '= 100 200)
(bin #f '= 200 100) (bin #f '= 200 100)
@ -253,6 +268,8 @@
(tri-if #f '= (lambda () 3) 3 1 void) (tri-if #f '= (lambda () 3) 3 1 void)
(tri-if #f '= (lambda () 3) 1 3 void) (tri-if #f '= (lambda () 3) 1 3 void)
(tri-if #f '= (lambda () 1) 3 3 void) (tri-if #f '= (lambda () 1) 3 3 void)
(bin-exact #f 'fl= 100.0 200.0)
(bin-exact #t 'fl= 200.0 200.0)
(un 3 'add1 2) (un 3 'add1 2)
(un -3 'add1 -4) (un -3 'add1 -4)
@ -276,6 +293,10 @@
(un (expt 2 30) 'abs (- (expt 2 30))) (un (expt 2 30) 'abs (- (expt 2 30)))
(un (sub1 (expt 2 62)) 'abs (sub1 (expt 2 62))) (un (sub1 (expt 2 62)) 'abs (sub1 (expt 2 62)))
(un (expt 2 62) 'abs (- (expt 2 62))) (un (expt 2 62) 'abs (- (expt 2 62)))
(un-exact 3.0 'flabs -3.0)
(un-exact 3.0 'flsqrt 9.0)
(un-exact +nan.0 'flsqrt -9.0)
(un 1.0 'exact->inexact 1) (un 1.0 'exact->inexact 1)
(un 1073741823.0 'exact->inexact (sub1 (expt 2 30))) (un 1073741823.0 'exact->inexact (sub1 (expt 2 30)))
@ -283,12 +304,15 @@
(un 4611686018427387903.0 'exact->inexact (sub1 (expt 2 62))) (un 4611686018427387903.0 'exact->inexact (sub1 (expt 2 62)))
(un -4611686018427387904.0 'exact->inexact (- (expt 2 62))) (un -4611686018427387904.0 'exact->inexact (- (expt 2 62)))
(un-exact 10.0 '->fl 10)
(bin 11 '+ 4 7) (bin 11 '+ 4 7)
(bin -3 '+ 4 -7) (bin -3 '+ 4 -7)
(bin (expt 2 30) '+ (expt 2 29) (expt 2 29)) (bin (expt 2 30) '+ (expt 2 29) (expt 2 29))
(bin (- (expt 2 31) 2) '+ (sub1 (expt 2 30)) (sub1 (expt 2 30))) (bin (- (expt 2 31) 2) '+ (sub1 (expt 2 30)) (sub1 (expt 2 30)))
(tri 6 '+ (lambda () 1) 2 3 void) (tri 6 '+ (lambda () 1) 2 3 void)
(tri 13/2 '+ (lambda () 1) 5/2 3 void) (tri 13/2 '+ (lambda () 1) 5/2 3 void)
(bin-exact 3.4 'fl+ 1.1 2.3)
(bin 3 '- 7 4) (bin 3 '- 7 4)
(bin 11 '- 7 -4) (bin 11 '- 7 -4)
@ -298,6 +322,7 @@
(bin (- 2 (expt 2 31)) '- (- 1 (expt 2 30)) (sub1 (expt 2 30))) (bin (- 2 (expt 2 31)) '- (- 1 (expt 2 30)) (sub1 (expt 2 30)))
(tri 6 '- (lambda () 10) 3 1 void) (tri 6 '- (lambda () 10) 3 1 void)
(tri 13/2 '- (lambda () 10) 3 1/2 void) (tri 13/2 '- (lambda () 10) 3 1/2 void)
(bin-exact -0.75 'fl- 1.5 2.25)
(bin 4 '* 1 4) (bin 4 '* 1 4)
(bin 0 '* 0 4) (bin 0 '* 0 4)
@ -311,6 +336,7 @@
(bin (- (expt 2 30)) '* 2 (- (expt 2 29))) (bin (- (expt 2 30)) '* 2 (- (expt 2 29)))
(tri 30 '* (lambda () 2) 3 5 void) (tri 30 '* (lambda () 2) 3 5 void)
(tri 5 '* (lambda () 2) 3 5/6 void) (tri 5 '* (lambda () 2) 3 5/6 void)
(bin-exact 2.53 'fl* 1.1 2.3)
(bin 0 '/ 0 4) (bin 0 '/ 0 4)
(bin 1/4 '/ 1 4) (bin 1/4 '/ 1 4)
@ -321,6 +347,7 @@
(bin 4 '/ -16 -4) (bin 4 '/ -16 -4)
(tri 3 '/ (lambda () 30) 5 2 void) (tri 3 '/ (lambda () 30) 5 2 void)
(tri 12 '/ (lambda () 30) 5 1/2 void) (tri 12 '/ (lambda () 30) 5 1/2 void)
(bin-exact (/ 1.1 2.3) 'fl/ 1.1 2.3)
(bin-int 3 'quotient 10 3) (bin-int 3 'quotient 10 3)
(bin-int -3 'quotient 10 -3) (bin-int -3 'quotient 10 -3)

View File

@ -4,6 +4,7 @@
(Section 'unsafe) (Section 'unsafe)
(require scheme/unsafe/ops (require scheme/unsafe/ops
scheme/flonum
scheme/foreign) scheme/foreign)
(let () (let ()

View File

@ -1,3 +1,6 @@
Version 4.2.3.8
Added scheme/flonum; moved flvector operations to scheme/flonum
Version 4.2.3.6 Version 4.2.3.6
Changed JIT to support unboxed local binding of known-flonum Changed JIT to support unboxed local binding of known-flonum
arguments to unsafe-fl functions arguments to unsafe-fl functions

View File

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

View File

@ -56,6 +56,7 @@ static int env_uid_counter = 0;
static Scheme_Object *kernel_symbol; static Scheme_Object *kernel_symbol;
static Scheme_Env *kernel_env; static Scheme_Env *kernel_env;
static Scheme_Env *unsafe_env; static Scheme_Env *unsafe_env;
static Scheme_Env *flonum_env;
#define MAX_CONST_LOCAL_POS 64 #define MAX_CONST_LOCAL_POS 64
#define MAX_CONST_LOCAL_TYPES 2 #define MAX_CONST_LOCAL_TYPES 2
@ -436,10 +437,40 @@ static void init_unsafe(Scheme_Env *env)
#endif #endif
} }
static void init_flonum(Scheme_Env *env)
{
Scheme_Module_Phase_Exports *pt;
REGISTER_SO(flonum_env);
flonum_env = scheme_primitive_module(scheme_intern_symbol("#%flonum"), env);
scheme_init_flonum_number(flonum_env);
scheme_init_flonum_numarith(flonum_env);
scheme_init_flonum_numcomp(flonum_env);
scheme_finish_primitive_module(flonum_env);
pt = flonum_env->module->me->rt;
scheme_populate_pt_ht(pt);
scheme_protect_primitive_provide(flonum_env, NULL);
#if USE_COMPILED_STARTUP
if (builtin_ref_counter != (EXPECTED_PRIM_COUNT + EXPECTED_UNSAFE_COUNT + EXPECTED_FLONUM_COUNT)) {
printf("Flonum count %d doesn't match expected count %d\n",
builtin_ref_counter - EXPECTED_PRIM_COUNT - EXPECTED_UNSAFE_COUNT,
EXPECTED_FLONUM_COUNT);
abort();
}
#endif
}
Scheme_Env *scheme_get_unsafe_env() { Scheme_Env *scheme_get_unsafe_env() {
return unsafe_env; return unsafe_env;
} }
Scheme_Env *scheme_get_flonum_env() {
return flonum_env;
}
static Scheme_Env *place_instance_init_post_kernel(int initial_main_os_thread) { static Scheme_Env *place_instance_init_post_kernel(int initial_main_os_thread) {
Scheme_Env *env; Scheme_Env *env;
/* error handling and buffers */ /* error handling and buffers */
@ -692,6 +723,7 @@ static void make_kernel_env(void)
#endif #endif
init_unsafe(env); init_unsafe(env);
init_flonum(env);
scheme_init_print_global_constants(); scheme_init_print_global_constants();
@ -1344,11 +1376,13 @@ Scheme_Object **scheme_make_builtin_references_table(void)
scheme_misc_count += sizeof(Scheme_Object *) * (builtin_ref_counter + 1); scheme_misc_count += sizeof(Scheme_Object *) * (builtin_ref_counter + 1);
#endif #endif
for (j = 0; j < 2; j++) { for (j = 0; j < 3; j++) {
if (!j) if (!j)
kenv = kernel_env; kenv = kernel_env;
else else if (j == 1)
kenv = unsafe_env; kenv = unsafe_env;
else
kenv = flonum_env;
ht = kenv->toplevel; ht = kenv->toplevel;
@ -1375,11 +1409,13 @@ Scheme_Hash_Table *scheme_map_constants_to_globals(void)
result = scheme_make_hash_table(SCHEME_hash_ptr); result = scheme_make_hash_table(SCHEME_hash_ptr);
for (j = 0; j < 2; j++) { for (j = 0; j < 3; j++) {
if (!j) if (!j)
kenv = kernel_env; kenv = kernel_env;
else else if (j == 1)
kenv = unsafe_env; kenv = unsafe_env;
else
kenv = flonum_env;
ht = kenv->toplevel; ht = kenv->toplevel;
bs = ht->buckets; bs = ht->buckets;
@ -1403,11 +1439,13 @@ const char *scheme_look_for_primitive(void *code)
long i; long i;
int j; int j;
for (j = 0; j < 2; j++) { for (j = 0; j < 3; j++) {
if (!j) if (!j)
kenv = kernel_env; kenv = kernel_env;
else else if (j == 1)
kenv = unsafe_env; kenv = unsafe_env;
else
kenv = flonum_env;
ht = kenv->toplevel; ht = kenv->toplevel;
bs = ht->buckets; bs = ht->buckets;
@ -3018,7 +3056,9 @@ scheme_lookup_binding(Scheme_Object *find_id, Scheme_Comp_Env *env, int flags,
/* Used to have `&& !SAME_OBJ(modidx, modname)' below, but that was a bad /* Used to have `&& !SAME_OBJ(modidx, modname)' below, but that was a bad
idea, because it causes module instances to be preserved. */ idea, because it causes module instances to be preserved. */
if (modname && !(flags & SCHEME_RESOLVE_MODIDS) if (modname && !(flags & SCHEME_RESOLVE_MODIDS)
&& (!(scheme_is_kernel_modname(modname) || scheme_is_unsafe_modname(modname)) && (!(scheme_is_kernel_modname(modname)
|| scheme_is_unsafe_modname(modname)
|| scheme_is_flonum_modname(modname))
|| (flags & SCHEME_REFERENCING))) { || (flags & SCHEME_REFERENCING))) {
/* Create a module variable reference, so that idx is preserved: */ /* Create a module variable reference, so that idx is preserved: */
return scheme_hash_module_variable(env->genv, modidx, find_id, return scheme_hash_module_variable(env->genv, modidx, find_id,
@ -3057,6 +3097,15 @@ Scheme_Object *scheme_extract_unsafe(Scheme_Object *o)
return NULL; return NULL;
} }
Scheme_Object *scheme_extract_flonum(Scheme_Object *o)
{
Scheme_Env *home = ((Scheme_Bucket_With_Home *)o)->home;
if (home && home->module && scheme_is_flonum_modname(home->module->modname))
return (Scheme_Object *)((Scheme_Bucket *)o)->val;
else
return NULL;
}
int *scheme_env_get_flags(Scheme_Comp_Env *frame, int start, int count) int *scheme_env_get_flags(Scheme_Comp_Env *frame, int start, int count)
{ {
int *v, i; int *v, i;

View File

@ -2686,11 +2686,12 @@ static int purely_functional_primitive(Scheme_Object *rator, int n)
#define IS_NAMED_PRIM(p, nm) (!strcmp(((Scheme_Primitive_Proc *)p)->name, nm)) #define IS_NAMED_PRIM(p, nm) (!strcmp(((Scheme_Primitive_Proc *)p)->name, nm))
int scheme_wants_flonum_arguments(Scheme_Object *rator) int scheme_wants_flonum_arguments(Scheme_Object *rator, int rotate_mode)
{ {
if (SCHEME_PRIMP(rator)) { if (SCHEME_PRIMP(rator)) {
if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL) { if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL) {
if (IS_NAMED_PRIM(rator, "unsafe-flabs") if (IS_NAMED_PRIM(rator, "unsafe-flabs")
|| IS_NAMED_PRIM(rator, "unsafe-flsqrt")
|| IS_NAMED_PRIM(rator, "unsafe-fl+") || IS_NAMED_PRIM(rator, "unsafe-fl+")
|| IS_NAMED_PRIM(rator, "unsafe-fl-") || IS_NAMED_PRIM(rator, "unsafe-fl-")
|| IS_NAMED_PRIM(rator, "unsafe-fl*") || IS_NAMED_PRIM(rator, "unsafe-fl*")
@ -2700,9 +2701,28 @@ int scheme_wants_flonum_arguments(Scheme_Object *rator)
|| IS_NAMED_PRIM(rator, "unsafe-fl=") || IS_NAMED_PRIM(rator, "unsafe-fl=")
|| IS_NAMED_PRIM(rator, "unsafe-fl>") || IS_NAMED_PRIM(rator, "unsafe-fl>")
|| IS_NAMED_PRIM(rator, "unsafe-fl>=") || IS_NAMED_PRIM(rator, "unsafe-fl>=")
|| IS_NAMED_PRIM(rator, "unsafe-flvector-ref") || IS_NAMED_PRIM(rator, "unsafe-flvector-ref"))
|| IS_NAMED_PRIM(rator, "unsafe-fx->fl"))
return 1; return 1;
} else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNARY_INLINED) {
if (!rotate_mode) {
if (IS_NAMED_PRIM(rator, "flabs")
|| IS_NAMED_PRIM(rator, "flsqrt"))
return 1;
}
} else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_BINARY_INLINED) {
if (!rotate_mode) {
if (IS_NAMED_PRIM(rator, "fl+")
|| IS_NAMED_PRIM(rator, "fl-")
|| IS_NAMED_PRIM(rator, "fl*")
|| IS_NAMED_PRIM(rator, "fl/")
|| IS_NAMED_PRIM(rator, "fl<")
|| IS_NAMED_PRIM(rator, "fl<=")
|| IS_NAMED_PRIM(rator, "fl=")
|| IS_NAMED_PRIM(rator, "fl>")
|| IS_NAMED_PRIM(rator, "fl>=")
|| IS_NAMED_PRIM(rator, "flvector-ref"))
return 1;
}
} else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_NARY_INLINED) { } else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_NARY_INLINED) {
if (IS_NAMED_PRIM(rator, "unsafe-flvector-set!")) if (IS_NAMED_PRIM(rator, "unsafe-flvector-set!"))
return 1; return 1;
@ -2714,9 +2734,10 @@ int scheme_wants_flonum_arguments(Scheme_Object *rator)
static int produces_unboxed(Scheme_Object *rator) static int produces_unboxed(Scheme_Object *rator)
{ {
if (SCHEME_PRIMP(rator) if (SCHEME_PRIMP(rator)) {
&& (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL)) { if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL) {
if (IS_NAMED_PRIM(rator, "unsafe-flabs") if (IS_NAMED_PRIM(rator, "unsafe-flabs")
|| IS_NAMED_PRIM(rator, "unsafe-flsqrt")
|| IS_NAMED_PRIM(rator, "unsafe-fl+") || IS_NAMED_PRIM(rator, "unsafe-fl+")
|| IS_NAMED_PRIM(rator, "unsafe-fl-") || IS_NAMED_PRIM(rator, "unsafe-fl-")
|| IS_NAMED_PRIM(rator, "unsafe-fl*") || IS_NAMED_PRIM(rator, "unsafe-fl*")
@ -2729,6 +2750,26 @@ static int produces_unboxed(Scheme_Object *rator)
|| IS_NAMED_PRIM(rator, "unsafe-flvector-ref") || IS_NAMED_PRIM(rator, "unsafe-flvector-ref")
|| IS_NAMED_PRIM(rator, "unsafe-fx->fl")) || IS_NAMED_PRIM(rator, "unsafe-fx->fl"))
return 1; return 1;
} else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNARY_INLINED) {
if (IS_NAMED_PRIM(rator, "flabs")
|| IS_NAMED_PRIM(rator, "flsqrt")
|| IS_NAMED_PRIM(rator, "->fl"))
return 1;
} else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_BINARY_INLINED) {
if (IS_NAMED_PRIM(rator, "flabs")
|| IS_NAMED_PRIM(rator, "flsqrt")
|| IS_NAMED_PRIM(rator, "fl+")
|| IS_NAMED_PRIM(rator, "fl-")
|| IS_NAMED_PRIM(rator, "fl*")
|| IS_NAMED_PRIM(rator, "fl/")
|| IS_NAMED_PRIM(rator, "fl<")
|| IS_NAMED_PRIM(rator, "fl<=")
|| IS_NAMED_PRIM(rator, "fl=")
|| IS_NAMED_PRIM(rator, "fl>")
|| IS_NAMED_PRIM(rator, "fl>=")
|| IS_NAMED_PRIM(rator, "flvector-ref"))
return 1;
}
} }
return 0; return 0;
@ -2827,7 +2868,7 @@ static Scheme_Object *check_unbox_rotation(Scheme_Object *_app, Scheme_Object *r
Scheme_Compiled_Let_Value *inner = NULL; Scheme_Compiled_Let_Value *inner = NULL;
int i, lifted = 0; int i, lifted = 0;
if (scheme_wants_flonum_arguments(rator)) { if (scheme_wants_flonum_arguments(rator, 1)) {
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
if (count == 1) if (count == 1)
rand = ((Scheme_App2_Rec *)_app)->rand; rand = ((Scheme_App2_Rec *)_app)->rand;
@ -2988,7 +3029,7 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info
return le; return le;
} }
if (scheme_wants_flonum_arguments(app->args[0])) if (scheme_wants_flonum_arguments(app->args[0], 0))
sub_context |= OPT_CONTEXT_FLONUM_ARG; sub_context |= OPT_CONTEXT_FLONUM_ARG;
} }
@ -3093,7 +3134,7 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf
return le; return le;
} }
if (scheme_wants_flonum_arguments(app->rator)) if (scheme_wants_flonum_arguments(app->rator, 0))
sub_context |= OPT_CONTEXT_FLONUM_ARG; sub_context |= OPT_CONTEXT_FLONUM_ARG;
le = scheme_optimize_expr(app->rand, info, sub_context); le = scheme_optimize_expr(app->rand, info, sub_context);
@ -3165,7 +3206,7 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf
return le; return le;
} }
if (scheme_wants_flonum_arguments(app->rator)) if (scheme_wants_flonum_arguments(app->rator, 0))
sub_context |= OPT_CONTEXT_FLONUM_ARG; sub_context |= OPT_CONTEXT_FLONUM_ARG;
/* 1st arg */ /* 1st arg */
@ -6071,6 +6112,9 @@ scheme_compile_expand_expr(Scheme_Object *form, Scheme_Comp_Env *env,
&& scheme_extract_unsafe(var)) { && scheme_extract_unsafe(var)) {
scheme_register_unsafe_in_prefix(env, rec, drec, menv); scheme_register_unsafe_in_prefix(env, rec, drec, menv);
return scheme_extract_unsafe(var); return scheme_extract_unsafe(var);
} else if (SAME_TYPE(SCHEME_TYPE(var), scheme_variable_type)
&& scheme_extract_flonum(var)) {
return scheme_extract_flonum(var);
} else if (SAME_TYPE(SCHEME_TYPE(var), scheme_variable_type) } else if (SAME_TYPE(SCHEME_TYPE(var), scheme_variable_type)
|| SAME_TYPE(SCHEME_TYPE(var), scheme_module_variable_type)) || SAME_TYPE(SCHEME_TYPE(var), scheme_module_variable_type))
return scheme_register_toplevel_in_prefix(var, env, rec, drec); return scheme_register_toplevel_in_prefix(var, env, rec, drec);

File diff suppressed because it is too large Load Diff

View File

@ -134,6 +134,7 @@ static Scheme_Object *kernel_modname;
static Scheme_Object *kernel_symbol; static Scheme_Object *kernel_symbol;
static Scheme_Object *kernel_modidx; static Scheme_Object *kernel_modidx;
static Scheme_Module *kernel; static Scheme_Module *kernel;
static Scheme_Object *flonum_modname;
static Scheme_Object *unsafe_modname; static Scheme_Object *unsafe_modname;
/* global read-only symbols */ /* global read-only symbols */
@ -332,6 +333,7 @@ void scheme_init_module(Scheme_Env *env)
REGISTER_SO(kernel_modname); REGISTER_SO(kernel_modname);
REGISTER_SO(kernel_modidx); REGISTER_SO(kernel_modidx);
REGISTER_SO(unsafe_modname); REGISTER_SO(unsafe_modname);
REGISTER_SO(flonum_modname);
kernel_symbol = scheme_intern_symbol("#%kernel"); kernel_symbol = scheme_intern_symbol("#%kernel");
kernel_modname = scheme_intern_resolved_module_path(kernel_symbol); kernel_modname = scheme_intern_resolved_module_path(kernel_symbol);
kernel_modidx = scheme_make_modidx(scheme_make_pair(quote_symbol, kernel_modidx = scheme_make_modidx(scheme_make_pair(quote_symbol,
@ -340,6 +342,7 @@ void scheme_init_module(Scheme_Env *env)
scheme_false, kernel_modname); scheme_false, kernel_modname);
(void)scheme_hash_key(kernel_modidx); (void)scheme_hash_key(kernel_modidx);
unsafe_modname = scheme_intern_resolved_module_path(scheme_intern_symbol("#%unsafe")); unsafe_modname = scheme_intern_resolved_module_path(scheme_intern_symbol("#%unsafe"));
flonum_modname = scheme_intern_resolved_module_path(scheme_intern_symbol("#%flonum"));
REGISTER_SO(module_symbol); REGISTER_SO(module_symbol);
REGISTER_SO(module_begin_symbol); REGISTER_SO(module_begin_symbol);
@ -597,10 +600,16 @@ int scheme_is_unsafe_modname(Scheme_Object *modname)
return SAME_OBJ(modname, unsafe_modname); return SAME_OBJ(modname, unsafe_modname);
} }
int scheme_is_flonum_modname(Scheme_Object *modname)
{
return SAME_OBJ(modname, flonum_modname);
}
static int is_builtin_modname(Scheme_Object *modname) static int is_builtin_modname(Scheme_Object *modname)
{ {
return (SAME_OBJ(modname, kernel_modname) return (SAME_OBJ(modname, kernel_modname)
|| SAME_OBJ(modname, unsafe_modname)); || SAME_OBJ(modname, unsafe_modname)
|| SAME_OBJ(modname, flonum_modname));
} }
Scheme_Object *scheme_sys_wraps(Scheme_Comp_Env *env) Scheme_Object *scheme_sys_wraps(Scheme_Comp_Env *env)
@ -1785,7 +1794,8 @@ static Scheme_Object *namespace_unprotect_module(int argc, Scheme_Object *argv[]
code_insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR); code_insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR);
if (!SAME_OBJ(name, kernel_modname)) { if (!SAME_OBJ(name, kernel_modname)
&& !SAME_OBJ(name, flonum_modname)) {
if (SAME_OBJ(name, unsafe_modname)) if (SAME_OBJ(name, unsafe_modname))
menv2 = scheme_get_unsafe_env(); menv2 = scheme_get_unsafe_env();
else else
@ -2447,6 +2457,8 @@ void scheme_prep_namespace_rename(Scheme_Env *menv)
im = kernel; im = kernel;
else if (SAME_OBJ(name, unsafe_modname)) else if (SAME_OBJ(name, unsafe_modname))
im = scheme_get_unsafe_env()->module; im = scheme_get_unsafe_env()->module;
else if (SAME_OBJ(name, flonum_modname))
im = scheme_get_flonum_env()->module;
else else
im = (Scheme_Module *)scheme_hash_get(menv->module_registry, name); im = (Scheme_Module *)scheme_hash_get(menv->module_registry, name);
@ -2841,6 +2853,8 @@ static Scheme_Object *module_export_protected_p(int argc, Scheme_Object **argv)
mv = (Scheme_Object *)kernel; mv = (Scheme_Object *)kernel;
else if (SAME_OBJ(modname, unsafe_modname)) else if (SAME_OBJ(modname, unsafe_modname))
mv = (Scheme_Object *)scheme_get_unsafe_env()->module; mv = (Scheme_Object *)scheme_get_unsafe_env()->module;
else if (SAME_OBJ(modname, flonum_modname))
mv = (Scheme_Object *)scheme_get_flonum_env()->module;
else else
mv = scheme_hash_get(env->module_registry, modname); mv = scheme_hash_get(env->module_registry, modname);
if (!mv) { if (!mv) {
@ -3134,6 +3148,8 @@ static Scheme_Module *module_load(Scheme_Object *name, Scheme_Env *env, const ch
return kernel; return kernel;
else if (name == unsafe_modname) else if (name == unsafe_modname)
return scheme_get_unsafe_env()->module; return scheme_get_unsafe_env()->module;
else if (name == flonum_modname)
return scheme_get_flonum_env()->module;
else { else {
Scheme_Module *m; Scheme_Module *m;
@ -3218,6 +3234,8 @@ Scheme_Env *scheme_module_access(Scheme_Object *name, Scheme_Env *env, int rev_m
return scheme_get_kernel_env(); return scheme_get_kernel_env();
else if ((name == unsafe_modname) && !rev_mod_phase) else if ((name == unsafe_modname) && !rev_mod_phase)
return scheme_get_unsafe_env(); return scheme_get_unsafe_env();
else if ((name == flonum_modname) && !rev_mod_phase)
return scheme_get_flonum_env();
else { else {
Scheme_Object *chain; Scheme_Object *chain;
Scheme_Env *menv; Scheme_Env *menv;
@ -3556,7 +3574,8 @@ int scheme_module_export_position(Scheme_Object *modname, Scheme_Env *env, Schem
Scheme_Object *pos; Scheme_Object *pos;
if (SAME_OBJ(modname, kernel_modname) if (SAME_OBJ(modname, kernel_modname)
|| SAME_OBJ(modname, unsafe_modname)) || SAME_OBJ(modname, unsafe_modname)
|| SAME_OBJ(modname, flonum_modname))
return -1; return -1;
m = module_load(modname, env, NULL); m = module_load(modname, env, NULL);
@ -3580,8 +3599,9 @@ Scheme_Object *scheme_module_syntax(Scheme_Object *modname, Scheme_Env *env, Sch
kenv = scheme_get_kernel_env(); kenv = scheme_get_kernel_env();
name = SCHEME_STX_SYM(name); name = SCHEME_STX_SYM(name);
return scheme_lookup_in_table(kenv->syntax, (char *)name); return scheme_lookup_in_table(kenv->syntax, (char *)name);
} else if (SAME_OBJ(modname, unsafe_modname)) { } else if (SAME_OBJ(modname, unsafe_modname)
/* no unsafe syntax */ || SAME_OBJ(modname, flonum_modname)) {
/* no unsafe or flonum syntax */
return NULL; return NULL;
} else { } else {
Scheme_Env *menv; Scheme_Env *menv;
@ -4528,6 +4548,12 @@ Scheme_Object *scheme_builtin_value(const char *name)
if (v) if (v)
return v; return v;
/* Try flonum next: */
a[0] = flonum_modname;
v = _dynamic_require(2, a, scheme_get_env(NULL), 0, 0, 0, 0, 0, -1);
if (v)
return v;
/* Try unsafe next: */ /* Try unsafe next: */
a[0] = unsafe_modname; a[0] = unsafe_modname;
v = _dynamic_require(2, a, scheme_get_env(NULL), 0, 0, 0, 0, 0, -1); v = _dynamic_require(2, a, scheme_get_env(NULL), 0, 0, 0, 0, 0, -1);
@ -4836,6 +4862,8 @@ module_execute(Scheme_Object *data)
if (SAME_OBJ(m->modname, kernel_modname)) if (SAME_OBJ(m->modname, kernel_modname))
old_menv = scheme_get_kernel_env(); old_menv = scheme_get_kernel_env();
else if (SAME_OBJ(m->modname, flonum_modname))
old_menv = scheme_get_flonum_env();
else if (SAME_OBJ(m->modname, unsafe_modname)) else if (SAME_OBJ(m->modname, unsafe_modname))
old_menv = scheme_get_unsafe_env(); old_menv = scheme_get_unsafe_env();
else else
@ -5457,12 +5485,15 @@ static Scheme_Object *do_module(Scheme_Object *form, Scheme_Comp_Env *env,
LOG_START_EXPAND(m); LOG_START_EXPAND(m);
if (SAME_OBJ(m->modname, kernel_modname) if (SAME_OBJ(m->modname, kernel_modname)
|| SAME_OBJ(m->modname, unsafe_modname)) { || SAME_OBJ(m->modname, unsafe_modname)
|| SAME_OBJ(m->modname, flonum_modname)) {
/* Too confusing. Give it a different name while compiling. */ /* Too confusing. Give it a different name while compiling. */
Scheme_Object *k2; Scheme_Object *k2;
const char *kname; const char *kname;
if (SAME_OBJ(m->modname, kernel_modname)) if (SAME_OBJ(m->modname, kernel_modname))
kname = "#%kernel"; kname = "#%kernel";
else if (SAME_OBJ(m->modname, flonum_modname))
kname = "#%flonum";
else else
kname = "#%unsafe"; kname = "#%unsafe";
k2 = scheme_intern_resolved_module_path(scheme_make_symbol(kname)); /* uninterned! */ k2 = scheme_intern_resolved_module_path(scheme_make_symbol(kname)); /* uninterned! */
@ -8800,6 +8831,8 @@ void scheme_do_module_rename_unmarshal(Scheme_Object *rn, Scheme_Object *info,
me = kernel->me; me = kernel->me;
} else if (SAME_OBJ(unsafe_modname, name)) { } else if (SAME_OBJ(unsafe_modname, name)) {
me = scheme_get_unsafe_env()->module->me; me = scheme_get_unsafe_env()->module->me;
} else if (SAME_OBJ(flonum_modname, name)) {
me = scheme_get_flonum_env()->module->me;
} else { } else {
if (!export_registry) { if (!export_registry) {
env = scheme_get_env(scheme_current_config()); env = scheme_get_env(scheme_current_config());

View File

@ -49,6 +49,13 @@ static Scheme_Object *fl_div (int argc, Scheme_Object *argv[]);
static Scheme_Object *fl_abs (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_abs (int argc, Scheme_Object *argv[]);
static Scheme_Object *fl_sqrt (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_sqrt (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_plus (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_minus (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_mult (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_div (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_abs (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_sqrt (int argc, Scheme_Object *argv[]);
#define zeroi scheme_exact_zero #define zeroi scheme_exact_zero
void scheme_init_numarith(Scheme_Env *env) void scheme_init_numarith(Scheme_Env *env)
@ -109,6 +116,41 @@ void scheme_init_numarith(Scheme_Env *env)
env); env);
} }
void scheme_init_flonum_numarith(Scheme_Env *env)
{
Scheme_Object *p;
p = scheme_make_folding_prim(fl_plus, "fl+", 2, 2, 1);
if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl+", p, env);
p = scheme_make_folding_prim(fl_minus, "fl-", 2, 2, 1);
if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl-", p, env);
p = scheme_make_folding_prim(fl_mult, "fl*", 2, 2, 1);
if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl*", p, env);
p = scheme_make_folding_prim(fl_div, "fl/", 2, 2, 1);
if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl/", p, env);
p = scheme_make_folding_prim(fl_abs, "flabs", 1, 1, 1);
if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant("flabs", p, env);
p = scheme_make_folding_prim(fl_sqrt, "flsqrt", 1, 1, 1);
if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant("flsqrt", p, env);
}
void scheme_init_unsafe_numarith(Scheme_Env *env) void scheme_init_unsafe_numarith(Scheme_Env *env)
{ {
Scheme_Object *p; Scheme_Object *p;
@ -145,37 +187,37 @@ void scheme_init_unsafe_numarith(Scheme_Env *env)
scheme_add_global_constant("unsafe-fxabs", p, env); scheme_add_global_constant("unsafe-fxabs", p, env);
p = scheme_make_folding_prim(fl_plus, "unsafe-fl+", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_plus, "unsafe-fl+", 2, 2, 1);
if (scheme_can_inline_fp_op()) if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl+", p, env); scheme_add_global_constant("unsafe-fl+", p, env);
p = scheme_make_folding_prim(fl_minus, "unsafe-fl-", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_minus, "unsafe-fl-", 2, 2, 1);
if (scheme_can_inline_fp_op()) if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl-", p, env); scheme_add_global_constant("unsafe-fl-", p, env);
p = scheme_make_folding_prim(fl_mult, "unsafe-fl*", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_mult, "unsafe-fl*", 2, 2, 1);
if (scheme_can_inline_fp_op()) if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl*", p, env); scheme_add_global_constant("unsafe-fl*", p, env);
p = scheme_make_folding_prim(fl_div, "unsafe-fl/", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_div, "unsafe-fl/", 2, 2, 1);
if (scheme_can_inline_fp_op()) if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl/", p, env); scheme_add_global_constant("unsafe-fl/", p, env);
p = scheme_make_folding_prim(fl_abs, "unsafe-flabs", 1, 1, 1); p = scheme_make_folding_prim(unsafe_fl_abs, "unsafe-flabs", 1, 1, 1);
if (scheme_can_inline_fp_op()) if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-flabs", p, env); scheme_add_global_constant("unsafe-flabs", p, env);
p = scheme_make_folding_prim(fl_sqrt, "unsafe-flsqrt", 1, 1, 1); p = scheme_make_folding_prim(unsafe_fl_sqrt, "unsafe-flsqrt", 1, 1, 1);
if (scheme_can_inline_fp_op()) if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
@ -834,25 +876,48 @@ static Scheme_Object *fx_abs(int argc, Scheme_Object *argv[])
return scheme_make_double(v); \ return scheme_make_double(v); \
} }
UNSAFE_FL(fl_plus, +, plus) UNSAFE_FL(unsafe_fl_plus, +, plus)
UNSAFE_FL(fl_minus, -, minus) UNSAFE_FL(unsafe_fl_minus, -, minus)
UNSAFE_FL(fl_mult, *, mult) UNSAFE_FL(unsafe_fl_mult, *, mult)
UNSAFE_FL(fl_div, /, div_prim) UNSAFE_FL(unsafe_fl_div, /, div_prim)
static Scheme_Object *fl_abs(int argc, Scheme_Object *argv[]) #define UNSAFE_FL1(name, op, fold) \
{ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \
double v; { \
if (scheme_current_thread->constant_folding) return scheme_abs(argc, argv); double v; \
v = SCHEME_DBL_VAL(argv[0]); if (scheme_current_thread->constant_folding) return fold(argc, argv); \
v = fabs(v); v = SCHEME_DBL_VAL(argv[0]); \
return scheme_make_double(v); v = op(v); \
} return scheme_make_double(v); \
}
static Scheme_Object *fl_sqrt(int argc, Scheme_Object *argv[]) UNSAFE_FL1(unsafe_fl_abs, fabs, scheme_abs)
{ UNSAFE_FL1(unsafe_fl_sqrt, sqrt, scheme_sqrt)
double v;
if (scheme_current_thread->constant_folding) return scheme_sqrt(argc, argv); #define SAFE_FL(name, sname, op) \
v = SCHEME_DBL_VAL(argv[0]); static Scheme_Object *name(int argc, Scheme_Object *argv[]) \
v = sqrt(v); { \
return scheme_make_double(v); double v; \
} if (!SCHEME_FLOATP(argv[0])) scheme_wrong_type(sname, "inexact-real", 0, argc, argv); \
if (!SCHEME_FLOATP(argv[1])) scheme_wrong_type(sname, "inexact-real", 1, argc, argv); \
v = SCHEME_DBL_VAL(argv[0]) op SCHEME_DBL_VAL(argv[1]); \
return scheme_make_double(v); \
}
SAFE_FL(fl_plus, "fl+", +)
SAFE_FL(fl_minus, "fl-", -)
SAFE_FL(fl_mult, "fl*", *)
SAFE_FL(fl_div, "fl/", /)
#define SAFE_FL1(name, sname, op) \
static Scheme_Object *name(int argc, Scheme_Object *argv[]) \
{ \
double v; \
if (!SCHEME_FLOATP(argv[0])) scheme_wrong_type(sname, "inexact-real", 0, argc, argv); \
v = SCHEME_DBL_VAL(argv[0]); \
v = op(v); \
return scheme_make_double(v); \
}
SAFE_FL1(fl_abs, "flabs", fabs)
SAFE_FL1(fl_sqrt, "flsqrt", sqrt)

View File

@ -103,6 +103,8 @@ static Scheme_Object *flvector_p (int argc, Scheme_Object *argv[]);
static Scheme_Object *flvector_length (int argc, Scheme_Object *argv[]); static Scheme_Object *flvector_length (int argc, Scheme_Object *argv[]);
static Scheme_Object *make_flvector (int argc, Scheme_Object *argv[]); static Scheme_Object *make_flvector (int argc, Scheme_Object *argv[]);
static Scheme_Object *integer_to_fl (int argc, Scheme_Object *argv[]);
static Scheme_Object *fx_and (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_and (int argc, Scheme_Object *argv[]);
static Scheme_Object *fx_or (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_or (int argc, Scheme_Object *argv[]);
static Scheme_Object *fx_xor (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_xor (int argc, Scheme_Object *argv[]);
@ -506,6 +508,11 @@ scheme_init_number (Scheme_Env *env)
1, 1, 1), 1, 1, 1),
env); env);
}
void scheme_init_flonum_number(Scheme_Env *env)
{
Scheme_Object *p;
scheme_add_global_constant("flvector", scheme_add_global_constant("flvector",
scheme_make_prim_w_arity(flvector, scheme_make_prim_w_arity(flvector,
"flvector", "flvector",
@ -538,6 +545,11 @@ scheme_init_number (Scheme_Env *env)
3, 3); 3, 3);
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_NARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_NARY_INLINED;
scheme_add_global_constant("flvector-set!", p, env); scheme_add_global_constant("flvector-set!", p, env);
p = scheme_make_folding_prim(integer_to_fl, "->fl", 1, 1, 1);
if (scheme_can_inline_fp_op())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant("->fl", p, env);
} }
void scheme_init_unsafe_number(Scheme_Env *env) void scheme_init_unsafe_number(Scheme_Env *env)
@ -3091,3 +3103,14 @@ static Scheme_Object *unsafe_flvector_set (int argc, Scheme_Object *argv[])
return scheme_void; return scheme_void;
} }
static Scheme_Object *integer_to_fl (int argc, Scheme_Object *argv[])
{
if (SCHEME_INTP(argv[0])
|| SCHEME_BIGNUMP(argv[0])) {
return scheme_exact_to_inexact(argc, argv);
} else {
scheme_wrong_type("->fl", "exact integer", 0, argc, argv);
return NULL;
}
}

View File

@ -50,6 +50,12 @@ static Scheme_Object *fl_gt (int argc, Scheme_Object *argv[]);
static Scheme_Object *fl_lt_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_lt_eq (int argc, Scheme_Object *argv[]);
static Scheme_Object *fl_gt_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_gt_eq (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_eq (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_lt (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_gt (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_lt_eq (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_fl_gt_eq (int argc, Scheme_Object *argv[]);
#define zeroi scheme_exact_zero #define zeroi scheme_exact_zero
void scheme_init_numcomp(Scheme_Env *env) void scheme_init_numcomp(Scheme_Env *env)
@ -104,6 +110,36 @@ void scheme_init_numcomp(Scheme_Env *env)
scheme_add_global_constant("min", p, env); scheme_add_global_constant("min", p, env);
} }
void scheme_init_flonum_numcomp(Scheme_Env *env)
{
Scheme_Object *p;
p = scheme_make_folding_prim(fl_eq, "fl=", 2, 2, 1);
if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl=", p, env);
p = scheme_make_folding_prim(fl_lt, "fl<", 2, 2, 1);
if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl<", p, env);
p = scheme_make_folding_prim(fl_gt, "fl>", 2, 2, 1);
if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl>", p, env);
p = scheme_make_folding_prim(fl_lt_eq, "fl<=", 2, 2, 1);
if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl<=", p, env);
p = scheme_make_folding_prim(fl_gt_eq, "fl>=", 2, 2, 1);
if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
scheme_add_global_constant("fl>=", p, env);
}
void scheme_init_unsafe_numcomp(Scheme_Env *env) void scheme_init_unsafe_numcomp(Scheme_Env *env)
{ {
Scheme_Object *p; Scheme_Object *p;
@ -133,31 +169,31 @@ void scheme_init_unsafe_numcomp(Scheme_Env *env)
| SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant("unsafe-fx>=", p, env); scheme_add_global_constant("unsafe-fx>=", p, env);
p = scheme_make_folding_prim(fl_eq, "unsafe-fl=", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_eq, "unsafe-fl=", 2, 2, 1);
if (scheme_can_inline_fp_comp()) if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl=", p, env); scheme_add_global_constant("unsafe-fl=", p, env);
p = scheme_make_folding_prim(fl_lt, "unsafe-fl<", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_lt, "unsafe-fl<", 2, 2, 1);
if (scheme_can_inline_fp_comp()) if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl<", p, env); scheme_add_global_constant("unsafe-fl<", p, env);
p = scheme_make_folding_prim(fl_gt, "unsafe-fl>", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_gt, "unsafe-fl>", 2, 2, 1);
if (scheme_can_inline_fp_comp()) if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl>", p, env); scheme_add_global_constant("unsafe-fl>", p, env);
p = scheme_make_folding_prim(fl_lt_eq, "unsafe-fl<=", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_lt_eq, "unsafe-fl<=", 2, 2, 1);
if (scheme_can_inline_fp_comp()) if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
scheme_add_global_constant("unsafe-fl<=", p, env); scheme_add_global_constant("unsafe-fl<=", p, env);
p = scheme_make_folding_prim(fl_gt_eq, "unsafe-fl>=", 2, 2, 1); p = scheme_make_folding_prim(unsafe_fl_gt_eq, "unsafe-fl>=", 2, 2, 1);
if (scheme_can_inline_fp_comp()) if (scheme_can_inline_fp_comp())
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED;
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL;
@ -387,6 +423,23 @@ UNSAFE_FX(fx_gt, >, scheme_bin_gt)
UNSAFE_FX(fx_lt_eq, <=, scheme_bin_lt_eq) UNSAFE_FX(fx_lt_eq, <=, scheme_bin_lt_eq)
UNSAFE_FX(fx_gt_eq, >=, scheme_bin_gt_eq) UNSAFE_FX(fx_gt_eq, >=, scheme_bin_gt_eq)
#define SAFE_FL(name, sname, op) \
static Scheme_Object *name(int argc, Scheme_Object *argv[]) \
{ \
if (!SCHEME_FLOATP(argv[0])) scheme_wrong_type(sname, "inexact-real", 0, argc, argv); \
if (!SCHEME_FLOATP(argv[1])) scheme_wrong_type(sname, "inexact-real", 1, argc, argv); \
if (SCHEME_DBL_VAL(argv[0]) op SCHEME_DBL_VAL(argv[1])) \
return scheme_true; \
else \
return scheme_false; \
}
SAFE_FL(fl_eq, "fl=", ==)
SAFE_FL(fl_lt, "fl<", <)
SAFE_FL(fl_gt, "fl>", >)
SAFE_FL(fl_lt_eq, "fl<=", <=)
SAFE_FL(fl_gt_eq, "fl>=", >=)
#define UNSAFE_FL(name, op, fold) \ #define UNSAFE_FL(name, op, fold) \
static Scheme_Object *name(int argc, Scheme_Object *argv[]) \ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \
{ \ { \
@ -397,8 +450,8 @@ UNSAFE_FX(fx_gt_eq, >=, scheme_bin_gt_eq)
return scheme_false; \ return scheme_false; \
} }
UNSAFE_FL(fl_eq, ==, scheme_bin_eq) UNSAFE_FL(unsafe_fl_eq, ==, scheme_bin_eq)
UNSAFE_FL(fl_lt, <, scheme_bin_lt) UNSAFE_FL(unsafe_fl_lt, <, scheme_bin_lt)
UNSAFE_FL(fl_gt, >, scheme_bin_gt) UNSAFE_FL(unsafe_fl_gt, >, scheme_bin_gt)
UNSAFE_FL(fl_lt_eq, <=, scheme_bin_lt_eq) UNSAFE_FL(unsafe_fl_lt_eq, <=, scheme_bin_lt_eq)
UNSAFE_FL(fl_gt_eq, >=, scheme_bin_gt_eq) UNSAFE_FL(unsafe_fl_gt_eq, >=, scheme_bin_gt_eq)

View File

@ -4688,7 +4688,7 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
break; break;
case CPT_REFERENCE: case CPT_REFERENCE:
l = read_compact_number(port); l = read_compact_number(port);
RANGE_CHECK(l, < (EXPECTED_PRIM_COUNT + EXPECTED_UNSAFE_COUNT)); RANGE_CHECK(l, < (EXPECTED_PRIM_COUNT + EXPECTED_UNSAFE_COUNT + EXPECTED_FLONUM_COUNT));
return variable_references[l]; return variable_references[l];
break; break;
case CPT_LOCAL: case CPT_LOCAL:

View File

@ -13,8 +13,9 @@
#define USE_COMPILED_STARTUP 1 #define USE_COMPILED_STARTUP 1
#define EXPECTED_PRIM_COUNT 965 #define EXPECTED_PRIM_COUNT 959
#define EXPECTED_UNSAFE_COUNT 53 #define EXPECTED_UNSAFE_COUNT 53
#define EXPECTED_FLONUM_COUNT 18
#ifdef MZSCHEME_SOMETHING_OMITTED #ifdef MZSCHEME_SOMETHING_OMITTED
# undef USE_COMPILED_STARTUP # undef USE_COMPILED_STARTUP

View File

@ -184,10 +184,13 @@ void scheme_init_vector(Scheme_Env *env);
void scheme_init_unsafe_vector(Scheme_Env *env); void scheme_init_unsafe_vector(Scheme_Env *env);
void scheme_init_string(Scheme_Env *env); void scheme_init_string(Scheme_Env *env);
void scheme_init_number(Scheme_Env *env); void scheme_init_number(Scheme_Env *env);
void scheme_init_numarith(Scheme_Env *env); void scheme_init_flonum_number(Scheme_Env *env);
void scheme_init_unsafe_numarith(Scheme_Env *env);
void scheme_init_unsafe_number(Scheme_Env *env); void scheme_init_unsafe_number(Scheme_Env *env);
void scheme_init_numarith(Scheme_Env *env);
void scheme_init_flonum_numarith(Scheme_Env *env);
void scheme_init_unsafe_numarith(Scheme_Env *env);
void scheme_init_numcomp(Scheme_Env *env); void scheme_init_numcomp(Scheme_Env *env);
void scheme_init_flonum_numcomp(Scheme_Env *env);
void scheme_init_unsafe_numcomp(Scheme_Env *env); void scheme_init_unsafe_numcomp(Scheme_Env *env);
void scheme_init_numstr(Scheme_Env *env); void scheme_init_numstr(Scheme_Env *env);
void scheme_init_eval(Scheme_Env *env); void scheme_init_eval(Scheme_Env *env);
@ -2117,6 +2120,7 @@ Scheme_Object *scheme_lookup_binding(Scheme_Object *symbol, Scheme_Comp_Env *env
Scheme_Object **_lexical_binding_id); Scheme_Object **_lexical_binding_id);
Scheme_Object *scheme_extract_unsafe(Scheme_Object *o); Scheme_Object *scheme_extract_unsafe(Scheme_Object *o);
Scheme_Object *scheme_extract_flonum(Scheme_Object *o);
Scheme_Object *scheme_add_env_renames(Scheme_Object *stx, Scheme_Comp_Env *env, Scheme_Object *scheme_add_env_renames(Scheme_Object *stx, Scheme_Comp_Env *env,
Scheme_Comp_Env *upto); Scheme_Comp_Env *upto);
@ -2321,7 +2325,7 @@ Scheme_Object *scheme_toplevel_to_flagged_toplevel(Scheme_Object *tl, int flags)
void scheme_env_make_closure_map(Optimize_Info *frame, mzshort *size, mzshort **map); void scheme_env_make_closure_map(Optimize_Info *frame, mzshort *size, mzshort **map);
int scheme_env_uses_toplevel(Optimize_Info *frame); int scheme_env_uses_toplevel(Optimize_Info *frame);
int scheme_wants_flonum_arguments(Scheme_Object *rator); int scheme_wants_flonum_arguments(Scheme_Object *rator, int rotate_mode);
int scheme_expr_produces_flonum(Scheme_Object *expr); int scheme_expr_produces_flonum(Scheme_Object *expr);
typedef struct Scheme_Once_Used { typedef struct Scheme_Once_Used {
@ -2851,6 +2855,7 @@ Scheme_Object *scheme_hash_module_variable(Scheme_Env *env, Scheme_Object *modid
Scheme_Env *scheme_get_kernel_env(); Scheme_Env *scheme_get_kernel_env();
int scheme_is_kernel_env(); int scheme_is_kernel_env();
Scheme_Env *scheme_get_unsafe_env(); Scheme_Env *scheme_get_unsafe_env();
Scheme_Env *scheme_get_flonum_env();
void scheme_install_initial_module_set(Scheme_Env *env); void scheme_install_initial_module_set(Scheme_Env *env);
Scheme_Bucket_Table *scheme_clone_toplevel(Scheme_Bucket_Table *ht, Scheme_Env *home); Scheme_Bucket_Table *scheme_clone_toplevel(Scheme_Bucket_Table *ht, Scheme_Env *home);
@ -2863,6 +2868,7 @@ Scheme_Module *scheme_extract_compiled_module(Scheme_Object *o);
int scheme_is_kernel_modname(Scheme_Object *modname); int scheme_is_kernel_modname(Scheme_Object *modname);
int scheme_is_unsafe_modname(Scheme_Object *modname); int scheme_is_unsafe_modname(Scheme_Object *modname);
int scheme_is_flonum_modname(Scheme_Object *modname);
void scheme_clear_modidx_cache(void); void scheme_clear_modidx_cache(void);
void scheme_clear_shift_cache(void); void scheme_clear_shift_cache(void);

View File

@ -13,12 +13,12 @@
consistently.) consistently.)
*/ */
#define MZSCHEME_VERSION "4.2.3.7" #define MZSCHEME_VERSION "4.2.3.8"
#define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_X 4
#define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Y 2
#define MZSCHEME_VERSION_Z 3 #define MZSCHEME_VERSION_Z 3
#define MZSCHEME_VERSION_W 7 #define MZSCHEME_VERSION_W 8
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)

View File

@ -3854,7 +3854,7 @@ scheme_resolve_lets(Scheme_Object *form, Resolve_Info *info)
if (SAME_TYPE(SCHEME_TYPE(app->rand), scheme_local_type) if (SAME_TYPE(SCHEME_TYPE(app->rand), scheme_local_type)
&& (SCHEME_LOCAL_POS(app->rand) == 1)) { && (SCHEME_LOCAL_POS(app->rand) == 1)) {
if ((SCHEME_TYPE(app->rator) > _scheme_values_types_) if ((SCHEME_TYPE(app->rator) > _scheme_values_types_)
&& !scheme_wants_flonum_arguments(app->rator)) { && !scheme_wants_flonum_arguments(app->rator, 1)) {
/* Move <expr> to app, and drop let-one: */ /* Move <expr> to app, and drop let-one: */
app->rand = ((Scheme_Let_One *)body)->value; app->rand = ((Scheme_Let_One *)body)->value;
scheme_reset_app2_eval_type(app); scheme_reset_app2_eval_type(app);