diff --git a/collects/compiler/cm.ss b/collects/compiler/cm.ss index 253af84f41..8897b45ea7 100644 --- a/collects/compiler/cm.ss +++ b/collects/compiler/cm.ss @@ -40,29 +40,34 @@ ;; use the date of the original file (or the zo, whichever ;; is newer). (let-values ([(base name dir) (split-path p)]) - (let* ([ext (filename-extension p)] - [pbytes (path->bytes name)] - [zo-file-name - (and ext - (bytes->path - (bytes-append - (subbytes - pbytes - 0 - (- (bytes-length pbytes) - (bytes-length ext))) - #"zo")))] - [zo-path (and zo-file-name - (build-path - base - (car (use-compiled-file-paths)) - zo-file-name))]) - (cond - [(and zo-file-name (file-exists? zo-path)) - (max (file-or-directory-modify-seconds p) - (file-or-directory-modify-seconds zo-file-name))] - [else - (file-or-directory-modify-seconds p)])))] + (let* ([p-date (file-or-directory-modify-seconds p #f (lambda () #f))] + [alt-date (and (not p-date) + (file-or-directory-modify-seconds + (rkt->ss p) + #f + (lambda () #f)))] + [date (or p-date alt-date)] + [get-zo-date (lambda (name) + (file-or-directory-modify-seconds + (build-path + base + (car (use-compiled-file-paths)) + (path-add-suffix name #".zo")) + #f + (lambda () #f)))] + [main-zo-date (and (or p-date (not alt-date)) + (get-zo-date name))] + [alt-zo-date (and (or alt-date + (and (not p-date) + (not alt-date) + (not main-zo-date))) + (get-zo-date (rkt->ss name)))] + [zo-date (or main-zo-date alt-zo-date)]) + (or (and date + zo-date + (max date zo-date)) + date + zo-date)))] [(null? p-eles) ;; this case shouldn't happen... I think. (c-loop (cdr paths))] @@ -81,7 +86,8 @@ (define (get-deps code path) (filter-map (lambda (x) (let ([r (resolve-module-path-index x path)]) - (and (path? r) (path->bytes r)))) + (and (path? r) + (path->bytes r)))) (append-map cdr (module-compiled-imports code)))) (define (get-compilation-dir+name mode path) @@ -104,8 +110,7 @@ (close-output-port (open-output-file path #:exists 'append))) (define (try-file-time path) - ;; might be better to use a `with-handlers' - (and (file-exists? path) (file-or-directory-modify-seconds path))) + (file-or-directory-modify-seconds path #f (lambda () #f))) (define (try-delete-file path) ;; Attempt to delete, but give up if it doesn't work: @@ -165,7 +170,7 @@ (date-hour d) (date-minute d) (date-second d)))) (define (verify-times ss-name zo-name) - (define ss-sec (try-file-time ss-name)) ; should exist + (define ss-sec (try-file-time ss-name)) (define zo-sec (try-file-time zo-name)) (cond [(not ss-sec) (error 'compile-zo "internal error")] [(not zo-sec) (error 'compile-zo "failed to create .zo file (~a) for ~a" @@ -184,6 +189,8 @@ (define-struct file-dependency (path) #:prefab) (define (compile-zo* mode path read-src-syntax zo-name) + ;; The `path' argument has been converted to .rkt or .ss form, + ;; as appropriate. ;; External dependencies registered through reader guard and ;; accomplice-logged events: (define external-deps null) @@ -275,9 +282,11 @@ (define depth (make-parameter 0)) -(define (compile-zo mode path read-src-syntax) - ((manager-compile-notify-handler) path) - (trace-printf "compiling: ~a" path) +(define (compile-zo mode path orig-path read-src-syntax) + ;; The `path' argument has been converted to .rkt or .ss form, + ;; as appropriate. + ((manager-compile-notify-handler) orig-path) + (trace-printf "compiling: ~a" orig-path) (parameterize ([indent (string-append " " (indent))]) (let* ([zo-name (path-add-suffix (get-compilation-path mode path) #".zo")] [zo-exists? (file-exists? zo-name)]) @@ -288,7 +297,7 @@ (build-string (depth) (λ (x) (if (= 2 (modulo x 3)) #\| #\space))) - path)) + orig-path)) (parameterize ([depth (+ (depth) 1)]) (with-handlers ([exn:get-module-code? @@ -298,7 +307,7 @@ (exn-message ex)) (raise ex))]) (compile-zo* mode path read-src-syntax zo-name))))))) - (trace-printf "end compile: ~a" path)) + (trace-printf "end compile: ~a" orig-path)) (define (get-compiled-time mode path) (define-values (dir name) (get-compilation-dir+name mode path)) @@ -308,31 +317,44 @@ (try-file-time (build-path dir (path-add-suffix name #".zo"))) -inf.0)) +(define (rkt->ss p) + (let ([b (path->bytes p)]) + (if (regexp-match? #rx#"[.]rkt$" b) + (path-replace-suffix p #".ss") + p))) + (define (compile-root mode path0 up-to-date read-src-syntax) - (define path (simplify-path (cleanse-path path0))) - (define (read-deps) + (define orig-path (simplify-path (cleanse-path path0))) + (define (read-deps path) (with-handlers ([exn:fail:filesystem? (lambda (ex) (list (version)))]) (call-with-input-file (path-add-suffix (get-compilation-path mode path) #".dep") read))) (define (do-check) - (define path-zo-time (get-compiled-time mode path)) - (define path-time (try-file-time path)) - (cond - [(not path-time) - (trace-printf "~a does not exist" path) - path-zo-time] - [else - (cond + (let* ([main-path orig-path] + [alt-path (rkt->ss orig-path)] + [main-path-time (try-file-time main-path)] + [alt-path-time (and (not main-path-time) + (not (eq? alt-path main-path)) + (try-file-time alt-path))] + [path (if alt-path-time alt-path main-path)] + [path-time (or main-path-time alt-path-time)] + [path-zo-time (get-compiled-time mode path)]) + (cond + [(not path-time) + (trace-printf "~a does not exist" orig-path) + path-zo-time] + [else + (cond [(> path-time path-zo-time) (trace-printf "newer src...") - (compile-zo mode path read-src-syntax)] + (compile-zo mode path orig-path read-src-syntax)] [else - (let ([deps (read-deps)]) + (let ([deps (read-deps path)]) (cond [(not (and (pair? deps) (equal? (version) (car deps)))) (trace-printf "newer version...") - (compile-zo mode path read-src-syntax)] + (compile-zo mode path orig-path read-src-syntax)] [(ormap (lambda (p) ;; (cons 'ext rel-path) => a non-module file (check date) @@ -348,13 +370,15 @@ d t path-zo-time) #t))) (cdr deps)) - (compile-zo mode path read-src-syntax)]))]) + (compile-zo mode path orig-path read-src-syntax)]))]) (let ([stamp (get-compiled-time mode path)]) - (hash-set! up-to-date path stamp) - stamp)])) - (or (and up-to-date (hash-ref up-to-date path #f)) - ((manager-skip-file-handler) path) - (begin (trace-printf "checking: ~a" path) + (hash-set! up-to-date main-path stamp) + (unless (eq? main-path alt-path) + (hash-set! up-to-date alt-path stamp)) + stamp)]))) + (or (and up-to-date (hash-ref up-to-date orig-path #f)) + ((manager-skip-file-handler) orig-path) + (begin (trace-printf "checking: ~a" orig-path) (do-check)))) (define (managed-compile-zo zo [read-src-syntax read-syntax]) @@ -362,13 +386,14 @@ (define (make-caching-managed-compile-zo [read-src-syntax read-syntax]) (let ([cache (make-hash)]) - (lambda (zo) + (lambda (src) (parameterize ([current-load/use-compiled (make-compilation-manager-load/use-compiled-handler/table cache)]) (compile-root (car (use-compiled-file-paths)) - (path->complete-path zo) - cache read-src-syntax) + (path->complete-path src) + cache + read-src-syntax) (void))))) (define (make-compilation-manager-load/use-compiled-handler) @@ -383,7 +408,10 @@ (define (compilation-manager-load-handler path mod-name) (cond [(not mod-name) (trace-printf "skipping: ~a mod-name ~s" path mod-name)] - [(not (file-exists? path)) + [(not (or (file-exists? path) + (let ([p2 (rkt->ss path)]) + (and (not (eq? path p2)) + (file-exists? p2))))) (trace-printf "skipping: ~a file does not exist" path)] [(or (null? (use-compiled-file-paths)) (not (equal? (car modes) diff --git a/collects/mzlib/include.ss b/collects/mzlib/include.ss index d86dee9d00..b8f460626e 100644 --- a/collects/mzlib/include.ss +++ b/collects/mzlib/include.ss @@ -76,91 +76,102 @@ (syntax-case stx () [(_ orig-stx ctx loc fn reader) ;; Parse the file name - (let ([c-file (resolve-path-spec (syntax fn) (syntax loc) (syntax orig-stx) #'build-path)] + (let ([orig-c-file (resolve-path-spec (syntax fn) (syntax loc) (syntax orig-stx) #'build-path)] [ctx (syntax ctx)] [loc (syntax loc)] [reader (syntax reader)] - [orig-stx (syntax orig-stx)]) + [orig-stx (syntax orig-stx)] + [rkt->ss (lambda (p) + (let ([b (path->bytes p)]) + (if (regexp-match? #rx#"[.]rkt$" b) + (path-replace-suffix p #".ss") + p)))]) - (register-external-file c-file) + (let ([c-file (if (file-exists? orig-c-file) + orig-c-file + (let ([p2 (rkt->ss orig-c-file)]) + (if (file-exists? p2) + p2 + orig-c-file)))]) + (register-external-file c-file) - (let ([read-syntax (if (syntax-e reader) - (reader-val - (let loop ([e (syntax-object->datum - (local-expand reader 'expression null))]) - (cond - [(reader? e) e] - [(pair? e) (or (loop (car e)) - (loop (cdr e)))] - [else #f]))) - read-syntax)]) - (unless (and (procedure? read-syntax) - (procedure-arity-includes? read-syntax 2)) - (raise-syntax-error - #f - "reader is not a procedure of two arguments" - orig-stx)) + (let ([read-syntax (if (syntax-e reader) + (reader-val + (let loop ([e (syntax-object->datum + (local-expand reader 'expression null))]) + (cond + [(reader? e) e] + [(pair? e) (or (loop (car e)) + (loop (cdr e)))] + [else #f]))) + read-syntax)]) + (unless (and (procedure? read-syntax) + (procedure-arity-includes? read-syntax 2)) + (raise-syntax-error + #f + "reader is not a procedure of two arguments" + orig-stx)) - ;; Open the included file - (let ([p (with-handlers ([exn:fail? - (lambda (exn) - (raise-syntax-error - #f - (format - "can't open include file (~a)" - (if (exn? exn) - (exn-message exn) - exn)) - orig-stx - c-file))]) - (open-input-file c-file))]) - (port-count-lines! p) - ;; Read expressions from file - (let ([content - (let loop () - (let ([r (with-handlers ([exn:fail? - (lambda (exn) - (close-input-port p) - (raise-syntax-error - #f - (format - "read error (~a)" - (if (exn? exn) - (exn-message exn) - exn)) - orig-stx))]) - (read-syntax c-file p))]) - (if (eof-object? r) - null - (cons r (loop)))))]) - (close-input-port p) - ;; Preserve src info for content, but set its - ;; lexical context to be that of the include expression - (let ([lexed-content - (let loop ([content content]) - (cond - [(pair? content) - (cons (loop (car content)) - (loop (cdr content)))] - [(null? content) null] - [else - (let ([v (syntax-e content)]) - (datum->syntax-object - ctx - (cond - [(pair? v) - (loop v)] - [(vector? v) - (list->vector (loop (vector->list v)))] - [(box? v) - (box (loop (unbox v)))] - [else - v]) - content))]))]) - (datum->syntax-object - (quote-syntax here) - `(begin ,@lexed-content) - orig-stx))))))])) + ;; Open the included file + (let ([p (with-handlers ([exn:fail? + (lambda (exn) + (raise-syntax-error + #f + (format + "can't open include file (~a)" + (if (exn? exn) + (exn-message exn) + exn)) + orig-stx + c-file))]) + (open-input-file c-file))]) + (port-count-lines! p) + ;; Read expressions from file + (let ([content + (let loop () + (let ([r (with-handlers ([exn:fail? + (lambda (exn) + (close-input-port p) + (raise-syntax-error + #f + (format + "read error (~a)" + (if (exn? exn) + (exn-message exn) + exn)) + orig-stx))]) + (read-syntax c-file p))]) + (if (eof-object? r) + null + (cons r (loop)))))]) + (close-input-port p) + ;; Preserve src info for content, but set its + ;; lexical context to be that of the include expression + (let ([lexed-content + (let loop ([content content]) + (cond + [(pair? content) + (cons (loop (car content)) + (loop (cdr content)))] + [(null? content) null] + [else + (let ([v (syntax-e content)]) + (datum->syntax-object + ctx + (cond + [(pair? v) + (loop v)] + [(vector? v) + (list->vector (loop (vector->list v)))] + [(box? v) + (box (loop (unbox v)))] + [else + v]) + content))]))]) + (datum->syntax-object + (quote-syntax here) + `(begin ,@lexed-content) + orig-stx)))))))])) (define (include/proc stx) (syntax-case stx () diff --git a/collects/scheme/include.ss b/collects/scheme/include.ss index 94cace375b..72c22ba0c7 100644 --- a/collects/scheme/include.ss +++ b/collects/scheme/include.ss @@ -15,94 +15,106 @@ (syntax-case stx () [(_ orig-stx ctx loc fn reader) ;; Parse the file name - (let ([c-file (resolve-path-spec (syntax fn) (syntax loc) (syntax orig-stx))] + (let ([orig-c-file (resolve-path-spec (syntax fn) (syntax loc) (syntax orig-stx))] [ctx (syntax ctx)] [loc (syntax loc)] [reader (syntax reader)] - [orig-stx (syntax orig-stx)]) - - (register-external-file c-file) + [orig-stx (syntax orig-stx)] + [rkt->ss (lambda (p) + (let ([b (path->bytes p)]) + (if (regexp-match? #rx#"[.]rkt$" b) + (path-replace-suffix p #".ss") + p)))]) - (let ([read-syntax (if (syntax-e reader) - (reader-val - (let loop ([e (syntax->datum - (local-expand reader 'expression null))]) - (cond - [(reader? e) e] - [(pair? e) (or (loop (car e)) - (loop (cdr e)))] - [else #f]))) - (lambda (src in) - (parameterize ([read-accept-reader #t]) - (read-syntax src in))))]) - (unless (and (procedure? read-syntax) - (procedure-arity-includes? read-syntax 2)) - (raise-syntax-error - #f - "reader is not a procedure of two arguments" - orig-stx)) + (let ([c-file (if (file-exists? orig-c-file) + orig-c-file + (let ([p2 (rkt->ss orig-c-file)]) + (if (file-exists? p2) + p2 + orig-c-file)))]) + + (register-external-file c-file) - ;; Open the included file - (let ([p (with-handlers ([exn:fail? - (lambda (exn) - (raise-syntax-error - #f - (format - "can't open include file (~a)" - (if (exn? exn) - (exn-message exn) - exn)) - orig-stx - c-file))]) - (open-input-file c-file))]) - (port-count-lines! p) - ;; Read expressions from file - (let ([content - (let loop () - (let ([r (with-handlers ([exn:fail? - (lambda (exn) - (close-input-port p) - (raise-syntax-error - #f - (format - "read error (~a)" - (if (exn? exn) - (exn-message exn) - exn)) - orig-stx))]) - (read-syntax c-file p))]) - (if (eof-object? r) - null - (cons r (loop)))))]) - (close-input-port p) - ;; Preserve src info for content, but set its - ;; lexical context to be that of the include expression - (let ([lexed-content - (let loop ([content content]) - (cond - [(pair? content) - (cons (loop (car content)) - (loop (cdr content)))] - [(null? content) null] - [else - (let ([v (syntax-e content)]) - (datum->syntax - ctx - (cond - [(pair? v) - (loop v)] - [(vector? v) - (list->vector (loop (vector->list v)))] - [(box? v) - (box (loop (unbox v)))] - [else - v]) - content - content))]))]) - (datum->syntax - (quote-syntax here) - `(begin ,@lexed-content) - orig-stx))))))])) + (let ([read-syntax (if (syntax-e reader) + (reader-val + (let loop ([e (syntax->datum + (local-expand reader 'expression null))]) + (cond + [(reader? e) e] + [(pair? e) (or (loop (car e)) + (loop (cdr e)))] + [else #f]))) + (lambda (src in) + (parameterize ([read-accept-reader #t]) + (read-syntax src in))))]) + (unless (and (procedure? read-syntax) + (procedure-arity-includes? read-syntax 2)) + (raise-syntax-error + #f + "reader is not a procedure of two arguments" + orig-stx)) + + ;; Open the included file + (let ([p (with-handlers ([exn:fail? + (lambda (exn) + (raise-syntax-error + #f + (format + "can't open include file (~a)" + (if (exn? exn) + (exn-message exn) + exn)) + orig-stx + c-file))]) + (open-input-file c-file))]) + (port-count-lines! p) + ;; Read expressions from file + (let ([content + (let loop () + (let ([r (with-handlers ([exn:fail? + (lambda (exn) + (close-input-port p) + (raise-syntax-error + #f + (format + "read error (~a)" + (if (exn? exn) + (exn-message exn) + exn)) + orig-stx))]) + (read-syntax c-file p))]) + (if (eof-object? r) + null + (cons r (loop)))))]) + (close-input-port p) + ;; Preserve src info for content, but set its + ;; lexical context to be that of the include expression + (let ([lexed-content + (let loop ([content content]) + (cond + [(pair? content) + (cons (loop (car content)) + (loop (cdr content)))] + [(null? content) null] + [else + (let ([v (syntax-e content)]) + (datum->syntax + ctx + (cond + [(pair? v) + (loop v)] + [(vector? v) + (list->vector (loop (vector->list v)))] + [(box? v) + (box (loop (unbox v)))] + [else + v]) + content + content))]))]) + (datum->syntax + (quote-syntax here) + `(begin ,@lexed-content) + orig-stx)))))))])) (define-syntax (include stx) (syntax-case stx () diff --git a/collects/scheme/sandbox.ss b/collects/scheme/sandbox.ss index 000eb3c1ba..9c9547d201 100644 --- a/collects/scheme/sandbox.ss +++ b/collects/scheme/sandbox.ss @@ -275,7 +275,11 @@ (if m (module-compiled-imports m) null)))))) - (cons path r)))]))) + (let ([l (cons path r)]) + ;; If we need an .rkt path, also allow access to .ss path + (if (regexp-match? #rx#"[.]rkt$" (path->bytes path)) + (cons (path-replace-suffix path #".ss") l) + l))))]))) ;; Resources ---------------------------------------------------------------- diff --git a/collects/scribble/extract.ss b/collects/scribble/extract.ss index 66380c7888..679b804277 100644 --- a/collects/scribble/extract.ss +++ b/collects/scribble/extract.ss @@ -23,7 +23,15 @@ [else c])) (define-for-syntax (extract orig-path stx) - (let ([path (resolve-path-spec orig-path orig-path stx)]) + (let* ([n-path (resolve-path-spec orig-path orig-path stx)] + [path (if (regexp-match? #rx#"[.]rkt$" (path->bytes n-path)) + (if (file-exists? n-path) + n-path + (let ([ss (path-replace-suffix n-path #".ss")]) + (if (file-exists? ss) + ss + n-path))) + n-path)]) (let ([s-exp (parameterize ([current-namespace (make-base-namespace)] [read-accept-reader #t] diff --git a/collects/scribblings/mzc/make.scrbl b/collects/scribblings/mzc/make.scrbl index 6b1927c5cf..63ab9fe249 100644 --- a/collects/scribblings/mzc/make.scrbl +++ b/collects/scribblings/mzc/make.scrbl @@ -252,15 +252,17 @@ A parameter whose value is called for each file that is loaded and @defproc[(file-date-in-collection [p path?]) (or/c number? #f)]{ Calls @scheme[file-date-in-paths] with @scheme[p] and - @scheme[(current-library-collection-paths)]. -} + @scheme[(current-library-collection-paths)].} @defproc[(file-date-in-paths [p path?] [paths (listof path?)]) (or/c number? #f)]{ - This is a function intended to be used with @scheme[manager-skip-file-handler]. - It returns the date of the @tt{.ss} or @tt{.zo} file (whichever is newer) - for any path that is inside the @scheme[paths] argument, and - @scheme[#f] for any other path. -} + +Returns the file-modification date of @scheme[p] or its bytecode form + (i.e., @filepath{.zo} file), whichever exists and is newer, if + @scheme[p] is an extension of any path in @scheme[paths] (i.e., + exists in the directory, a subdirectory, etc.). Otherwise, the result + is @scheme[#f]. + + This function is intended for use with @scheme[manager-skip-file-handler].} @; ---------------------------------------------------------------------- diff --git a/collects/scribblings/reference/eval.scrbl b/collects/scribblings/reference/eval.scrbl index 88a3690dff..868da20ba4 100644 --- a/collects/scribblings/reference/eval.scrbl +++ b/collects/scribblings/reference/eval.scrbl @@ -213,24 +213,34 @@ The protocol for a @tech{compiled-load handler} is the same as for the @tech{load handler} (see @scheme[current-load]), except that a @tech{compiled-load handler} is expected to set @scheme[current-load-relative-directory] itself. The default -@tech{compiled-load handler}, however, checks for @filepath{.zo} files -(usually produced with @scheme[compile-file]) and @filepath{.so} (Unix), -@filepath{.dll} (Windows), or @filepath{.dylib} (Mac OS X) files. +@tech{compiled-load handler}, however, checks for a @filepath{.ss} +file when then given path ends with @filepath{.rkt} and no +@filepath{.rkt} file exists. In addition, the default +@tech{compiled-load handler} checks for @filepath{.zo} (bytecode) +files and @filepath{.so} (native Unix), @filepath{.dll} (native +Windows), or @filepath{.dylib} (native Mac OS X) files. The check for a compiled file occurs whenever the given path -@scheme[_file] ends with any extension (e.g., @filepath{.ss} or -@filepath{.scm}), and the check consults the subdirectories indicated by -the @scheme[use-compiled-file-paths] parameter relative to -@scheme[_file]. The subdirectories are checked in order. A @filepath{.zo} -version of the file is loaded if it exists directly in one of the -indicated subdirectories, or a @filepath{.so}/@filepath{.dll}/@filepath{.dylib} -version of the file is loaded if it exists within a @filepath{native} -subdirectory of a @scheme[use-compiled-file-paths] directory, in an -even deeper subdirectory as named by -@scheme[system-library-subpath]. A compiled file is loaded only if its -modification date is not older than the date for @scheme[_file]. If -both @filepath{.zo} and @filepath{.so}/@filepath{.dll}/@filepath{.dylib} files are -available, the @filepath{.so}/@filepath{.dll}/@filepath{.dylib} file is used. +@scheme[_file] ends with any extension (e.g., @filepath{.rkt} or +@filepath{.scrbl}), and the check consults the subdirectories +indicated by the @scheme[use-compiled-file-paths] parameter relative +to @scheme[_file]. The subdirectories are checked in order. A +@filepath{.zo} version of the file (whose name is formed by passing +@scheme[_file] and @scheme[#".zo"] to @scheme[path-add-suffix]) is +loaded if it exists directly in one of the indicated subdirectories, +or a @filepath{.so}/@filepath{.dll}/@filepath{.dylib} version of the +file is loaded if it exists within a @filepath{native} subdirectory of +a @scheme[use-compiled-file-paths] directory, in an even deeper +subdirectory as named by @scheme[system-library-subpath]. A compiled +file is loaded only if its modification date is not older than the +date for @scheme[_file]. If both @filepath{.zo} and +@filepath{.so}/@filepath{.dll}/@filepath{.dylib} files are available, +the @filepath{.so}/@filepath{.dll}/@filepath{.dylib} file is used. If +@scheme[_file] ends with @filepath{.rkt}, no such file exists, and a +@filepath{.ss} file exists, then @filepath{.zo} and +@filepath{.so}/@filepath{.dll}/@filepath{.dylib} files are used only +with names based on @scheme[_file] with its suffixed replaced by +@filepath{.ss}. While a @filepath{.zo}, @filepath{.so}, @filepath{.dll}, or @filepath{.dylib} file is loaded, the current @scheme[load-relative] diff --git a/collects/scribblings/reference/module-reflect.scrbl b/collects/scribblings/reference/module-reflect.scrbl index 314ee33708..c97904ecb1 100644 --- a/collects/scribblings/reference/module-reflect.scrbl +++ b/collects/scribblings/reference/module-reflect.scrbl @@ -61,7 +61,7 @@ the grammar for @scheme[_module-path] for @scheme[require], A parameter that determines the current @deftech{module name resolver}, which manages the conversion from other kinds of module -references to a symbol or @tech{resolved module path}. For example, +references to a @tech{resolved module path}. For example, when the expander encounters @scheme[(require _module-path)] where @scheme[_module-path] is not an identifier, then the expander passes @scheme['_module-path] to the module name resolver to obtain a symbol @@ -223,7 +223,7 @@ above).} Combines @scheme[path] and @scheme[mpi] to create a new @tech{module path index}. The @scheme[path] argument can @scheme[#f] only if -@scheme[mpi] is also @scheme[false].} +@scheme[mpi] is also @scheme[#f].} @defproc[(compiled-module-expression? [v any/c]) boolean?]{ diff --git a/collects/scribblings/reference/syntax.scrbl b/collects/scribblings/reference/syntax.scrbl index a80f4f198b..94f3afeb8c 100644 --- a/collects/scribblings/reference/syntax.scrbl +++ b/collects/scribblings/reference/syntax.scrbl @@ -456,8 +456,9 @@ corresponds to the default @tech{module name resolver}. Refers to a module previously declared interactively with the name @scheme[id]. - Example: Require'ing a module named test. - @scheme[(require 'test)]} + @examples[ + (code:comment @#,t{a module declared interactively as @schemeidfont{test}:}) + (eval:alts (require '@#,schemeidfont{test}) (void))]} @specsubform[rel-string]{A path relative to the containing source (as determined by @scheme[current-load-relative-directory] or @@ -481,13 +482,18 @@ corresponds to the default @tech{module name resolver}. UTF-8 encoding). Such encodings are not decoded to arrive at a filename, but instead preserved in the file access.} - Example: Require a module named x.ss in the same directory as this file. + If @scheme[rel-string] ends with a @filepath{.ss} suffix, it is + converted to a @filepath{.rkt} suffix. The @tech{compiled-load + handler} may reverse that conversion if a @filepath{.rkt} file does + not exist and a @filepath{.ss} exists. - @scheme[(require "x.ss")] - - Require a module named x.ss in the parent directory. - - @scheme[(require "../x.ss")]} + @examples[ + (code:comment @#,t{a module named @filepath{x.rkt} in the same}) + (code:comment @#,t{directory as the enclosing module's file:}) + (eval:alts (require "x.rkt") (void)) + (code:comment @#,t{a module named @filepath{x.rkt} in the parent directory}) + (code:comment @#,t{of the enclosing module file's directory:}) + (eval:alts (require "../x.rkt") (void))]} @defsubform[(lib rel-string ...+)]{A path to a module installed into a @tech{collection} (see @secref["collects"]). The @scheme[rel-string]s in @@ -503,43 +509,52 @@ corresponds to the default @tech{module name resolver}. @item{If a single @scheme[rel-string] is provided, and if it consists of a single element (i.e., no @litchar{/}) with no file suffix (i.e., no @litchar{.}), then @scheme[rel-string] names a - @tech{collection}, and @filepath{main.ss} is the library file name. + @tech{collection}, and @filepath{main.rkt} is the library file name. - Example: require swindle - @defexamples[#:eval require-eval - (eval:alts (require (lib "swindle")) (void))]} + @examples[ + (code:comment @#,t{the main @schememodname[swindle] library:}) + (eval:alts (require (lib "swindle")) (void)) + (code:comment @#,t{the same:}) + (eval:alts (require (lib "swindle/main.rkt")) (void))]} @item{If a single @scheme[rel-string] is provided, and if it consists of multiple @litchar{/}-separated elements, then each element up to the last names a @tech{collection}, subcollection, etc., and the last element names a file. If the last element has - no file suffix, @filepath{.ss} is added. + no file suffix, @filepath{.rkt} is added, while a @filepath{.ss} + suffix is converted to @filepath{.rkt}. - Example: require a file within the swindle collection - @defexamples[#:eval require-eval - (eval:alts (require (lib "swindle/turbo")) (void))]} + @examples[ + (code:comment @#,t{@filepath{turbo.rkt} from the @filepath{swindle} collection:}) + (eval:alts (require (lib "swindle/turbo")) (void)) + (code:comment @#,t{the same:}) + (eval:alts (require (lib "swindle/turbo.rkt")) (void)) + (code:comment @#,t{the same:}) + (eval:alts (require (lib "swindle/turbo.ss")) (void))]} @item{If a single @scheme[rel-string] is provided, and if it consists of a single element @italic{with} a file suffix (i.e, with a @litchar{.}), then @scheme[rel-string] names a file within - the @filepath{mzlib} @tech{collection}. (This convention is for + the @filepath{mzlib} @tech{collection}. A @filepath{.ss} + suffix is converted to @filepath{.rkt}. (This convention is for compatibility with older version of PLT Scheme.) - Example: require the tar module from mzlib - @defexamples[#:eval require-eval - (eval:alts (require (lib "tar.ss")) (void))]} + @examples[ + (code:comment @#,t{@filepath{tar.rkt} module from the @filepath{mzlib} collection:}) + (eval:alts (require (lib "tar.ss")) (void))]} @item{Otherwise, when multiple @scheme[rel-string]s are provided, the first @scheme[rel-string] is effectively moved after the others, and all @scheme[rel-string]s are appended with @litchar{/} separators. The resulting path names a @tech{collection}, then subcollection, etc., ending with a file name. No suffix is added - automatically. (This convention is for compatibility - with older version of PLT Scheme.) + automatically, but a @filepath{.ss} suffix is converted to + @filepath{.rkt}. (This convention is for compatibility with older + version of PLT Scheme.) - Example: require the tar module from mzlib - @defexamples[#:eval require-eval - (eval:alts (require (lib "tar.ss" "mzlib")) (void))]} + @examples[ + (code:comment @#,t{@filepath{tar.rkt} module from the @filepath{mzlib} collection:}) + (eval:alts (require (lib "tar.ss" "mzlib")) (void))]} ]} @specsubform[id]{A shorthand for a @scheme[lib] form with a single @@ -553,8 +568,9 @@ corresponds to the default @tech{module name resolver}. @defsubform[(file string)]{Similar to the plain @scheme[rel-string] case, but @scheme[string] is a path---possibly absolute---using the current platform's path conventions and @scheme[expand-user-path]. + A @filepath{.ss} suffix is converted to @filepath{.rkt}. - @examples[(eval:alts (require (file "~/tmp/x.ss")) (void))]} + @examples[(eval:alts (require (file "~/tmp/x.rkt")) (void))]} @defsubform*[((planet id) (planet string) @@ -590,14 +606,15 @@ corresponds to the default @tech{module name resolver}. (that do not encode one of the other allowed characters), and an @nonterm{int} is a non-empty sequence of ASCII digits. As this shorthand is expended, a @filepath{.plt} extension is added to - @nonterm{pkg}, and a @filepath{.ss} extension is added to - @nonterm{path}; if no @nonterm{path} is included, @filepath{main.ss} + @nonterm{pkg}, and a @filepath{.rkt} extension is added to + @nonterm{path}; if no @nonterm{path} is included, @filepath{main.rkt} is used in the expansion. A @scheme[(planet string)] form is like a @scheme[(planet id)] form with the identifier converted to a string, except that the @scheme[string] can optionally end with a file extension (i.e., a - @litchar{.}) for a @nonterm{path}. + @litchar{.}) for a @nonterm{path}. A @filepath{.ss} file extension is + converted to @filepath{.rkt}. In the more general last form of a @scheme[planet] module path, the @scheme[rel-string]s are similar to the @scheme[lib] form, except @@ -615,13 +632,13 @@ corresponds to the default @tech{module name resolver}. symbolically. @examples[ - (code:comment @#,t{@filepath{main.ss} in package @filepath{farm} by @filepath{mcdonald}:}) + (code:comment @#,t{@filepath{main.rkt} in package @filepath{farm} by @filepath{mcdonald}:}) (eval:alts (require (planet mcdonald/farm)) (void)) - (code:comment @#,t{@filepath{main.ss} in version >= 2.0 of @filepath{farm} by @filepath{mcdonald}:}) + (code:comment @#,t{@filepath{main.rkt} in version >= 2.0 of @filepath{farm} by @filepath{mcdonald}:}) (eval:alts (require (planet mcdonald/farm:2)) (void)) - (code:comment @#,t{@filepath{main.ss} in version >= 2.5 of @filepath{farm} by @filepath{mcdonald}:}) + (code:comment @#,t{@filepath{main.rkt} in version >= 2.5 of @filepath{farm} by @filepath{mcdonald}:}) (eval:alts (require (planet mcdonald/farm:2:5)) (void)) - (code:comment @#,t{@filepath{duck.ss} in version >= 2.5 of @filepath{farm} by @filepath{mcdonald}:}) + (code:comment @#,t{@filepath{duck.rkt} in version >= 2.5 of @filepath{farm} by @filepath{mcdonald}:}) (eval:alts (require (planet mcdonald/farm:2:5/duck)) (void)) ]} @@ -629,7 +646,7 @@ No identifier can be bound multiple times in a given @tech{phase level} by an import, unless all of the bindings refer to the same original definition in the same module. In a @tech{module context}, an identifier can be either imported or defined for a given -@tech{phase level}, but not both.}} +@tech{phase level}, but not both.} @guideintro["module-provide"]{@scheme[provide]} diff --git a/collects/syntax/modcode.ss b/collects/syntax/modcode.ss index b0f732497d..0292e3ad21 100644 --- a/collects/syntax/modcode.ss +++ b/collects/syntax/modcode.ss @@ -78,22 +78,52 @@ [sub-path sub-path0] [compiler compile0] [extension-handler ext-handler0] #:choose [choose (lambda (src zo so) #f)] #:notify [notify void] - #:source-reader [read-src-syntax read-syntax]) + #:source-reader [read-src-syntax read-syntax] + #:rkt-try-ss? [rkt-try-ss? #t]) (unless (path-string? path) (raise-type-error 'get-module-code "path or string (sans nul)" path)) - (let*-values ([(path) (resolve path)] - [(base file dir?) (split-path path)] + (let*-values ([(orig-path) (resolve path)] + [(base orig-file dir?) (split-path path)] + [(main-file alt-file) + (if rkt-try-ss? + (let* ([b (path->bytes orig-file)] + [len (bytes-length b)]) + (cond + [(and (len . >= . 4) + (bytes=? #".rkt" (subbytes b (- len 4)))) + ;; .rkt => try .rkt then .ss + (values orig-file + (bytes->path (bytes-append (subbytes b 0 (- len 4)) #".ss")))] + [else + ;; No search path + (values orig-file #f)])) + (values orig-file #f))] + [(main-path) (if (eq? main-file orig-file) + orig-path + (build-path base main-file))] + [(alt-path) (and alt-file + (if (eq? alt-file orig-file) + orig-path + (build-path base alt-file)))] [(base) (if (eq? base 'relative) 'same base)] [(mode) (use-compiled-file-paths)]) - (let* ([get-so (lambda (file) + (let* ([main-path-d (file-or-directory-modify-seconds path #f (lambda () #f))] + [alt-path-d (and alt-path + (file-or-directory-modify-seconds alt-path #f (lambda () #f)))] + [path-d (or main-path-d alt-path-d)] + [file (if alt-path-d alt-file main-file)] + [path (if alt-path-d alt-path main-path)] + [try-alt? (and (not alt-path-d) (not main-path-d))] + [get-so (lambda (file) (build-path base sub-path "native" (system-library-subpath) (path-add-suffix file (system-type 'so-suffix))))] [zo (build-path base sub-path (path-add-suffix file #".zo"))] + [alt-zo (and try-alt? + (build-path base sub-path (path-add-suffix alt-file #".zo")))] [so (get-so file)] - [path-d (with-handlers ([exn:fail:filesystem? (lambda (x) #f)]) - (file-or-directory-modify-seconds path))] + [alt-so (and try-alt? (get-so alt-file))] [with-dir (lambda (t) (parameterize ([current-load-relative-directory (if (path? base) @@ -105,13 +135,17 @@ ;; Use .zo, if it's new enough [(or (eq? prefer 'zo) (and (not prefer) - (date>=? zo path-d))) + (or (date>=? zo path-d) + (and try-alt? + (date>=? alt-zo path-d))))) (notify zo) (read-one path zo #f read-syntax)] ;; Maybe there's an .so? Use it only if we don't prefer source. [(or (eq? prefer 'so) (and (not prefer) - (date>=? so path-d))) + (or (date>=? so path-d) + (and try-alt? + (date>=? alt-so path-d))))) (if extension-handler (begin (notify so) @@ -124,9 +158,9 @@ [(or (eq? prefer 'src) path-d) (notify path) - (with-dir (lambda () (compiler (read-one path path #t read-src-syntax))))] + (with-dir (lambda () (compiler (read-one orig-path path #t read-src-syntax))))] ;; Report a not-there error [else (raise (make-exn:get-module-code - (format "get-module-code: no such file: ~e" path) + (format "get-module-code: no such file: ~e" orig-path) (current-continuation-marks) #f))]))))) diff --git a/collects/syntax/modresolve.ss b/collects/syntax/modresolve.ss index e6a4dba735..690c640bf2 100644 --- a/collects/syntax/modresolve.ss +++ b/collects/syntax/modresolve.ss @@ -21,6 +21,12 @@ [(procedure? relto) (relto)] [else (current-directory)])) +(define (path-ss->rkt p) + (let-values ([(base name dir?) (split-path p)]) + (if (regexp-match #rx"[.]ss$" (path->bytes name)) + (path-replace-suffix p #".rkt") + p))) + (define (resolve-module-path s relto) ;; relto should be a complete path, #f, or procedure that returns a ;; complete path @@ -32,17 +38,19 @@ (module-path-index-join s #f)))] [(string? s) ;; Parse Unix-style relative path string - (apply build-path (get-dir) (explode-relpath-string s))] + (path-ss->rkt + (apply build-path (get-dir) (explode-relpath-string s)))] [(and (or (not (pair? s)) (not (list? s))) (not (path? s))) #f] [(or (path? s) (eq? (car s) 'file)) (let ([p (if (path? s) s (cadr s))]) - (path->complete-path - p (let ([d (get-dir)]) - (if (path-string? d) - d - (or (current-load-relative-directory) - (current-directory))))))] + (path-ss->rkt + (path->complete-path + p (let ([d (get-dir)]) + (if (path-string? d) + d + (or (current-load-relative-directory) + (current-directory)))))))] [(or (eq? (car s) 'lib) (eq? (car s) 'quote) (eq? (car s) 'planet)) @@ -57,7 +65,7 @@ (let-values ([(path base) (module-path-index-split mpi)]) (if path (resolve-module-path path (resolve-possible-module-path-index base relto)) - (force-relto relto #f)))) + (path-ss->rkt (force-relto relto #f))))) (define (resolve-possible-module-path-index base relto) (cond [(module-path-index? base) diff --git a/collects/syntax/private/modcollapse-noctc.ss b/collects/syntax/private/modcollapse-noctc.ss index 35b2ddd7e7..6285cb3d69 100644 --- a/collects/syntax/private/modcollapse-noctc.ss +++ b/collects/syntax/private/modcollapse-noctc.ss @@ -47,7 +47,20 @@ Use syntax/modcollapse instead. (define (add-main s) (if (regexp-match #rx"[.][^/]*$" s) s - (string-append s "/main.ss"))) + (string-append s "/main.rkt"))) + + (define (ss->rkt s) + (let ([len (string-length s)]) + (if (and (len . >= . 3) + (string=? ".ss" (substring s (- len 3)))) + (string-append (substring s 0 (- len 3)) ".rkt") + s))) + + (define (path-ss->rkt p) + (let-values ([(base name dir?) (split-path p)]) + (if (regexp-match #rx"[.]ss$" (path->bytes name)) + (path-replace-suffix p #".rkt") + p))) (define (combine-relative-elements elements) @@ -70,32 +83,34 @@ Use syntax/modcollapse instead. (when (symbol? relto-mp) (set! relto-mp `(lib ,(symbol->string relto-mp)))) (cond [(or (path? relto-mp) (and (string? relto-mp) (ormap path? elements))) - (apply build-path - (extract-base relto-mp) - (map (lambda (x) (if (bytes? x) (bytes->path x) x)) - elements))] + (path-ss->rkt + (apply build-path + (extract-base relto-mp) + (map (lambda (x) (if (bytes? x) (bytes->path x) x)) + elements)))] [(string? relto-mp) - (bytes->string/locale - (apply - bytes-append - (cond [(regexp-match #rx#"^(.*)/[^/]*$" - (string->bytes/locale relto-mp)) - => cadr] - [else #"."]) - (map (lambda (e) - (cond [(eq? e 'same) #"/."] - [(eq? e 'up) #"/.."] - [else (bytes-append - #"/" (if (path? e) (path->bytes e) e))])) - elements)))] + (ss->rkt + (bytes->string/locale + (apply + bytes-append + (cond [(regexp-match #rx#"^(.*)/[^/]*$" + (string->bytes/locale relto-mp)) + => cadr] + [else #"."]) + (map (lambda (e) + (cond [(eq? e 'same) #"/."] + [(eq? e 'up) #"/.."] + [else (bytes-append + #"/" (if (path? e) (path->bytes e) e))])) + elements))))] [(eq? (car relto-mp) 'file) (let ([path ((if (ormap path? elements) values path->string) - (attach-to-relative-path (cadr relto-mp)))]) + (path-ss->rkt (attach-to-relative-path (cadr relto-mp))))]) (if (path? path) path `(file ,path)))] [(eq? (car relto-mp) 'lib) (let ([relto-mp (if (null? (cddr relto-mp)) ;; old style => add 'mzlib - ;; new style => add main.ss or split + ;; new style => add main.rkt or split (let ([m (regexp-match-positions #rx"[/]" (cadr relto-mp))]) (if m ;; new style: split @@ -104,8 +119,8 @@ Use syntax/modcollapse instead. (if (regexp-match? #rx"[.]" (cadr relto-mp)) ;; old style: `(lib ,(cadr relto-mp) "mzlib") - ;; new style, add "main.ss": - `(lib "main.ss" ,(cadr relto-mp))))) + ;; new style, add "main.rkt": + `(lib "main.rkt" ,(cadr relto-mp))))) ;; already has at least two parts: relto-mp)]) (let ([path (attach-to-relative-path-string @@ -153,20 +168,23 @@ Use syntax/modcollapse instead. ;; It has a suffix: (if (regexp-match? #rx"/" e) ;; It has a path, so it's fine: - s + (let ([e2 (ss->rkt e)]) + (if (eq? e e2) + s + `(lib ,e2))) ;; No path, so add "mzlib/": - `(lib ,(string-append "mzlib/" e)))] + `(lib ,(string-append "mzlib/" (ss->rkt e))))] [(regexp-match? #rx"/" e) ;; It has a separator, so add a suffix: - `(lib ,(string-append e ".ss"))] + `(lib ,(string-append e ".rkt"))] [else - ;; No separator or suffix, so add "/main.ss": - `(lib ,(string-append e "/main.ss"))])) + ;; No separator or suffix, so add "/main.rkt": + `(lib ,(string-append e "/main.rkt"))])) ;; multi-string version: (if (regexp-match? #rx"[.]" (cadr s)) ;; there's a suffix, so we can collapse to a single string: `(lib ,(string-join (append (cddr s) - (list (cadr s))) + (list (ss->rkt (cadr s)))) "/")) ;; No suffix, so we must keep the old style: s))) @@ -183,11 +201,11 @@ Use syntax/modcollapse instead. [pkg+vers (regexp-split #rx":" (cadr strs))] [path (cddr strs)]) `(planet ,(if (null? path) - "main.ss" + "main.rkt" (let ([str (last path)]) (if (regexp-match? #rx"[.]" str) - str - (string-append str ".ss")))) + (ss->rkt str) + (string-append str ".rkt")))) (,owner ,(string-append (car pkg+vers) ".plt") ,@(if (null? (cdr pkg+vers)) @@ -231,13 +249,17 @@ Use syntax/modcollapse instead. (let ([bases (split base)] [rests (map split rest)]) (list* (car s) - (last bases) + (ss->rkt (last bases)) (caddr s) (append (apply append rests) (drop-right bases 1))))) ;; already in normal form: - s))])) + (let* ([e (cadr s)] + [e2 (ss->rkt e)]) + (if (eq? e e2) + s + (list* (car s) e2 (cddr s))))))])) (cond [(string? s) ;; Parse Unix-style relative path string @@ -250,7 +272,13 @@ Use syntax/modcollapse instead. [(or (path? s) (eq? (car s) 'file)) (let ([p (if (path? s) s (cadr s))]) (if (absolute-path? p) - s + (let ([p2 (if (path? p) + (path-ss->rkt p) + (ss->rkt p))]) + (cond + [(eq? p p2) s] + [(path? s) p2] + [else `(file ,p2)])) (let loop ([p p] [elements null]) (let-values ([(base name dir?) (split-path p)]) (cond [(eq? base 'relative) diff --git a/collects/tests/mzscheme/cm.ss b/collects/tests/mzscheme/cm.ss index ce6d5b807a..4dae2effc3 100644 --- a/collects/tests/mzscheme/cm.ss +++ b/collects/tests/mzscheme/cm.ss @@ -102,4 +102,24 @@ ;; ---------------------------------------- +;; test `file-date-in-paths' +(test (file-or-directory-modify-seconds (build-path (collection-path "file") + "compiled" + "gif_ss.zo")) + file-date-in-collection + (build-path (collection-path "file") "gif.ss")) +;; gl-info.ss doesn't have a .ss source: +(test (file-or-directory-modify-seconds (build-path (collection-path "sgl") + "compiled" + "gl-info_ss.zo")) + file-date-in-collection + (build-path (collection-path "sgl") "gl-info.ss")) +;; setup/main doesn't have a .zo: +(test (file-or-directory-modify-seconds (build-path (collection-path "setup") + "main.ss")) + file-date-in-collection + (build-path (collection-path "setup") "main.ss")) + +;; ---------------------------------------- + (report-errs) diff --git a/collects/tests/mzscheme/moddep.ss b/collects/tests/mzscheme/moddep.ss index 99a173f59a..71c96d1257 100644 --- a/collects/tests/mzscheme/moddep.ss +++ b/collects/tests/mzscheme/moddep.ss @@ -24,34 +24,34 @@ (module-path-index-join #f #f))) pi-rel-to))) -(test-rmp (build-path (current-directory) "apple.ss") "apple.ss" #f) -(test-rmp (build-path (current-directory) "apple.ss") "apple.ss" (build-path (current-directory) "x.ss")) -(test-rmp (build-path (current-directory) "apple.ss") "apple.ss" current-directory) -(test-rmp (build-path (current-directory) 'up "apple.ss") "../apple.ss" #f) -(test-rmp (build-path (current-directory) 'up 'up "apple.ss") "../../apple.ss" #f) -(test-rmp (build-path (current-directory) 'same "apple.ss") "./apple.ss" #f) -(test-rmp (build-path (current-directory) "down" "apple.ss") "down/apple.ss" #f) +(test-rmp (build-path (current-directory) "apple.rkt") "apple.ss" #f) +(test-rmp (build-path (current-directory) "apple.rkt") "apple.ss" (build-path (current-directory) "x.ss")) +(test-rmp (build-path (current-directory) "apple.rkt") "apple.ss" current-directory) +(test-rmp (build-path (current-directory) 'up "apple.rkt") "../apple.ss" #f) +(test-rmp (build-path (current-directory) 'up 'up "apple.rkt") "../../apple.ss" #f) +(test-rmp (build-path (current-directory) 'same "apple.rkt") "./apple.ss" #f) +(test-rmp (build-path (current-directory) "down" "apple.rkt") "down/apple.ss" #f) -(test (build-path (current-directory) 'up 'up "apple.ss") +(test (build-path (current-directory) 'up 'up "apple.rkt") resolve-module-path-index (module-path-index-join "../apple.ss" (module-path-index-join "../other.ss" (module-path-index-join #f #f))) (build-path (current-directory) "f.ss")) -(test (build-path (current-directory) "only.ss") +(test (build-path (current-directory) "only.rkt") resolve-module-path-index (module-path-index-join #f #f) (build-path (current-directory) "only.ss")) (let ([mzlib (collection-path "mzlib")] [syntax (collection-path "syntax")]) - (test-rmp (build-path mzlib "x.ss") '(lib "x.ss") #f) - (test-rmp (build-path mzlib "x.ss") '(lib "x.ss" "mzlib") #f) - (test-rmp (build-path syntax "x.ss") '(lib "x.ss" "syntax") #f) - (test-rmp (build-path syntax "private" "x.ss") '(lib "x.ss" "syntax" "private") #f) - (test-rmp (build-path (current-directory) "x.ss") `(file ,(path->string (build-path (current-directory) "x.ss"))) #f) - (test-rmp (build-path (current-directory) "x.ss") (build-path (current-directory) "x.ss") #f) - (test-rmp (build-path (current-directory) "x.ss") (build-path "x.ss") #f) + (test-rmp (build-path mzlib "x.rkt") '(lib "x.ss") #f) + (test-rmp (build-path mzlib "x.rkt") '(lib "x.ss" "mzlib") #f) + (test-rmp (build-path syntax "x.rkt") '(lib "x.ss" "syntax") #f) + (test-rmp (build-path syntax "private" "x.rkt") '(lib "x.ss" "syntax" "private") #f) + (test-rmp (build-path (current-directory) "x.rkt") `(file ,(path->string (build-path (current-directory) "x.ss"))) #f) + (test-rmp (build-path (current-directory) "x.rkt") (build-path (current-directory) "x.ss") #f) + (test-rmp (build-path (current-directory) "x.rkt") (build-path "x.ss") #f) (void)) @@ -80,59 +80,164 @@ (module-path-index-join #f #f))) rel-to)) -(test-cmp '(lib "nonesuch/x.ss") "x.ss" '(lib "y.ss" "nonesuch")) -(test-cmp '(lib "nonesuch/x.ss") "x.ss" (lambda () '(lib "y.ss" "nonesuch"))) -(test-cmp '(lib "nonesuch/down/x.ss") "down/x.ss" '(lib "y.ss" "nonesuch")) -(test-cmp '(lib "mzlib/x.ss") '(lib "x.ss") '(lib "y.ss" "nonesuch")) -(test-cmp '(lib "nonesuch/x.ss") "../x.ss" '(lib "y.ss" "nonesuch/private")) -(test-cmp '(lib "nonesuch/x.ss") "../x.ss" '(lib "private/y.ss" "nonesuch")) -(test-cmp '(lib "alsonot/private/x.ss") '(lib "x.ss" "alsonot" "private") '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "nonesuch/x.rkt") "x.rkt" '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "nonesuch/x.rkt") "x.ss" '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "nonesuch/x.scm") "x.scm" '(lib "y.ss" "nonesuch")) + +(test-cmp '(lib "nonesuch/x.rkt") "x.rkt" (lambda () '(lib "y.ss" "nonesuch"))) +(test-cmp '(lib "nonesuch/x.rkt") "x.ss" (lambda () '(lib "y.ss" "nonesuch"))) +(test-cmp '(lib "nonesuch/x.scm") "x.scm" (lambda () '(lib "y.ss" "nonesuch"))) + +(test-cmp '(lib "nonesuch/down/x.rkt") "down/x.rkt" '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "nonesuch/down/x.rkt") "down/x.ss" '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "nonesuch/down/x.scm") "down/x.scm" '(lib "y.ss" "nonesuch")) + +(test-cmp '(lib "mzlib/x.rkt") '(lib "x.rkt") '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "mzlib/x.rkt") '(lib "x.ss") '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "mzlib/x.scm") '(lib "x.scm") '(lib "y.ss" "nonesuch")) + +(test-cmp '(lib "nonesuch/x.rkt") "../x.rkt" '(lib "y.ss" "nonesuch/private")) +(test-cmp '(lib "nonesuch/x.rkt") "../x.ss" '(lib "y.ss" "nonesuch/private")) +(test-cmp '(lib "nonesuch/x.scm") "../x.scm" '(lib "y.ss" "nonesuch/private")) + +(test-cmp '(lib "nonesuch/x.rkt") "../x.rkt" '(lib "private/y.ss" "nonesuch")) +(test-cmp '(lib "nonesuch/x.rkt") "../x.ss" '(lib "private/y.ss" "nonesuch")) +(test-cmp '(lib "nonesuch/x.scm") "../x.scm" '(lib "private/y.ss" "nonesuch")) + +(test-cmp '(lib "alsonot/private/x.rkt") '(lib "x.rkt" "alsonot" "private") '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "alsonot/private/x.rkt") '(lib "x.ss" "alsonot" "private") '(lib "y.ss" "nonesuch")) +(test-cmp '(lib "alsonot/private/x.scm") '(lib "x.scm" "alsonot" "private") '(lib "y.ss" "nonesuch")) + (test-cmp '(lib "x" "nonesuch") "x" '(lib "y.ss" "nonesuch")) (test-cmp '(lib "x" "nonesuch") "x" 'nonesuch/y) (test-cmp '(lib "x" "nonesuch") "x" 'nonesuch) -(test-cmp '(lib "nonesuch/y.ss") 'nonesuch/y (current-directory)) -(test-cmp '(lib "mzlib/nonesuch.ss") '(lib "nonesuch.ss") (current-directory)) +(test-cmp '(lib "nonesuch/y.rkt") 'nonesuch/y (current-directory)) -(test-cmp (build-path (current-directory) "x.ss") "x.ss" (build-path (current-directory) "other")) -(test-cmp (build-path (current-directory) "x.ss") +(test-cmp '(lib "mzlib/nonesuch.rkt") '(lib "nonesuch.rkt") (current-directory)) +(test-cmp '(lib "mzlib/nonesuch.rkt") '(lib "nonesuch.ss") (current-directory)) +(test-cmp '(lib "mzlib/nonesuch.scm") '(lib "nonesuch.scm") (current-directory)) + +(test-cmp (build-path (current-directory) "x.rkt") "x.rkt" (build-path (current-directory) "other")) +(test-cmp (build-path (current-directory) "x.rkt") "x.ss" (build-path (current-directory) "other")) +(test-cmp (build-path (current-directory) "x.scm") "x.scm" (build-path (current-directory) "other")) + +(test-cmp (build-path (current-directory) "x.rkt") + "x.rkt" + `(file ,(path->string (build-path (current-directory) "other")))) +(test-cmp (build-path (current-directory) "x.rkt") "x.ss" `(file ,(path->string (build-path (current-directory) "other")))) -(test-cmp (build-path (current-directory) "x.ss") - (build-path "x.ss") +(test-cmp (build-path (current-directory) "x.scm") + "x.scm" `(file ,(path->string (build-path (current-directory) "other")))) -(test-cmp '(planet "x.ss" ("usr" "pkg.plt" 1)) "x.ss" '(planet "y.ss" ("usr" "pkg.plt" 1))) -(test-cmp '(planet "x.ss" ("usr" "pkg.plt" 1 0)) "x.ss" (lambda () '(planet "y.ss" ("usr" "pkg.plt" 1 0)))) -(test-cmp '(planet "x.ss" ("a" "p.plt" 1) "path") "path/x.ss" '(planet "z.ss" ("a" "p.plt" 1))) -(test-cmp '(planet "x.ss" ("a" "p.plt" 2) "path" "qq") "qq/x.ss" '(planet "path/z.ss" ("a" "p.plt" 2))) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) '(planet "o.ss" ("a" "q.plt" 54 3))) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) '(lib "o.ss" "nonesuch")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) '(file "q.ss")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) (build-path "yikes")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2)) '(planet "m/z:2/x.ss") (build-path "yikes")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2 5)) '(planet "m/z:2:5/x.ss") (build-path "yikes")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2 (= 5))) '(planet "m/z:2:=5/x.ss") (build-path "yikes")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2 5)) '(planet "m/z:2:>=5/x.ss") (build-path "yikes")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2 (- 5))) '(planet "m/z:2:<=5/x.ss") (build-path "yikes")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.ss") (build-path "yikes")) -(test-cmp '(planet "x.ss" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.ss") (build-path "yikes")) +(test-cmp (build-path (current-directory) "x.rkt") + (build-path "x.rkt") + `(file ,(path->string (build-path (current-directory) "other")))) +(test-cmp (build-path (current-directory) "x.rkt") + (build-path "x.ss") + `(file ,(path->string (build-path (current-directory) "other")))) +(test-cmp (build-path (current-directory) "x.scm") + (build-path "x.scm") + `(file ,(path->string (build-path (current-directory) "other")))) -(test-cmp '(planet "utils.ss" ("untyped" "unlib.plt" 3 (= 6))) +(test-cmp '(planet "x.rkt" ("usr" "pkg.plt" 1)) "x.rkt" '(planet "y.ss" ("usr" "pkg.plt" 1))) +(test-cmp '(planet "x.rkt" ("usr" "pkg.plt" 1)) "x.ss" '(planet "y.ss" ("usr" "pkg.plt" 1))) +(test-cmp '(planet "x.scm" ("usr" "pkg.plt" 1)) "x.scm" '(planet "y.ss" ("usr" "pkg.plt" 1))) + +(test-cmp '(planet "x.rkt" ("usr" "pkg.plt" 1 0)) "x.rkt" (lambda () '(planet "y.ss" ("usr" "pkg.plt" 1 0)))) +(test-cmp '(planet "x.rkt" ("usr" "pkg.plt" 1 0)) "x.ss" (lambda () '(planet "y.ss" ("usr" "pkg.plt" 1 0)))) +(test-cmp '(planet "x.scm" ("usr" "pkg.plt" 1 0)) "x.scm" (lambda () '(planet "y.ss" ("usr" "pkg.plt" 1 0)))) + +(test-cmp '(planet "x.rkt" ("a" "p.plt" 1) "path") "path/x.rkt" '(planet "z.ss" ("a" "p.plt" 1))) +(test-cmp '(planet "x.rkt" ("a" "p.plt" 1) "path") "path/x.ss" '(planet "z.ss" ("a" "p.plt" 1))) +(test-cmp '(planet "x.scm" ("a" "p.plt" 1) "path") "path/x.scm" '(planet "z.ss" ("a" "p.plt" 1))) + +(test-cmp '(planet "x.rkt" ("a" "p.plt" 2) "path" "qq") "qq/x.rkt" '(planet "path/z.ss" ("a" "p.plt" 2))) +(test-cmp '(planet "x.rkt" ("a" "p.plt" 2) "path" "qq") "qq/x.ss" '(planet "path/z.ss" ("a" "p.plt" 2))) +(test-cmp '(planet "x.scm" ("a" "p.plt" 2) "path" "qq") "qq/x.scm" '(planet "path/z.ss" ("a" "p.plt" 2))) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "o.ss" ("a" "q.plt" 54 3))) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) '(planet "o.ss" ("a" "q.plt" 54 3))) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2)) '(planet "x.scm" ("m" "z.plt" 2)) '(planet "o.ss" ("a" "q.plt" 54 3))) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.rkt" ("m" "z.plt" 2)) '(lib "o.ss" "nonesuch")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) '(lib "o.ss" "nonesuch")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2)) '(planet "x.scm" ("m" "z.plt" 2)) '(lib "o.ss" "nonesuch")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.rkt" ("m" "z.plt" 2)) '(file "q.ss")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) '(file "q.ss")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2)) '(planet "x.scm" ("m" "z.plt" 2)) '(file "q.ss")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.rkt" ("m" "z.plt" 2)) (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "x.ss" ("m" "z.plt" 2)) (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2)) '(planet "x.scm" ("m" "z.plt" 2)) (build-path "yikes")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "m/z:2/x.rkt") (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2)) '(planet "m/z:2/x.ss") (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2)) '(planet "m/z:2/x.scm") (build-path "yikes")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 5)) '(planet "m/z:2:5/x.rkt") (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 5)) '(planet "m/z:2:5/x.ss") (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2 5)) '(planet "m/z:2:5/x.scm") (build-path "yikes")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (= 5))) '(planet "m/z:2:=5/x.rkt") (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (= 5))) '(planet "m/z:2:=5/x.ss") (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2 (= 5))) '(planet "m/z:2:=5/x.scm") (build-path "yikes")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 5)) '(planet "m/z:2:>=5/x.rkt") (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 5)) '(planet "m/z:2:>=5/x.ss") (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2 5)) '(planet "m/z:2:>=5/x.scm") (build-path "yikes")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (- 5))) '(planet "m/z:2:<=5/x.rkt") (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (- 5))) '(planet "m/z:2:<=5/x.ss") (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2 (- 5))) '(planet "m/z:2:<=5/x.scm") (build-path "yikes")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.rkt") (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.ss") (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.scm") (build-path "yikes")) + +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.rkt") (build-path "yikes")) +(test-cmp '(planet "x.rkt" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.ss") (build-path "yikes")) +(test-cmp '(planet "x.scm" ("m" "z.plt" 2 (7 99))) '(planet "m/z:2:7-99/x.scm") (build-path "yikes")) + +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6))) + "../utils.rkt" '(planet "doc/stuff.ss" ("untyped" "unlib.plt" 3 (= 6)))) +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6))) "../utils.ss" '(planet "doc/stuff.ss" ("untyped" "unlib.plt" 3 (= 6)))) -(test-cmp '(planet "utils.ss" ("untyped" "unlib.plt" 3 (= 6))) +(test-cmp '(planet "utils.scm" ("untyped" "unlib.plt" 3 (= 6))) + "../utils.scm" '(planet "doc/stuff.ss" ("untyped" "unlib.plt" 3 (= 6)))) + +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6))) + "../utils.rkt" '(planet "stuff.ss" ("untyped" "unlib.plt" 3 (= 6)) "doc")) +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6))) "../utils.ss" '(planet "stuff.ss" ("untyped" "unlib.plt" 3 (= 6)) "doc")) -(test-cmp '(planet "utils.ss" ("untyped" "unlib.plt" 3 (= 6)) "down") +(test-cmp '(planet "utils.scm" ("untyped" "unlib.plt" 3 (= 6))) + "../utils.scm" '(planet "stuff.ss" ("untyped" "unlib.plt" 3 (= 6)) "doc")) + +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6)) "down") + "../down/utils.rkt" '(planet "stuff.ss" ("untyped" "unlib.plt" 3 (= 6)) "doc")) +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6)) "down") "../down/utils.ss" '(planet "stuff.ss" ("untyped" "unlib.plt" 3 (= 6)) "doc")) -(test-cmp '(planet "utils.ss" ("untyped" "unlib.plt" 3 (= 6)) "down") +(test-cmp '(planet "utils.scm" ("untyped" "unlib.plt" 3 (= 6)) "down") + "../down/utils.scm" '(planet "stuff.ss" ("untyped" "unlib.plt" 3 (= 6)) "doc")) + +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6)) "down") + "../down/utils.rkt" '(planet untyped/unlib:3:=6/doc/stuff)) +(test-cmp '(planet "utils.rkt" ("untyped" "unlib.plt" 3 (= 6)) "down") "../down/utils.ss" '(planet untyped/unlib:3:=6/doc/stuff)) +(test-cmp '(planet "utils.scm" ("untyped" "unlib.plt" 3 (= 6)) "down") + "../down/utils.scm" '(planet untyped/unlib:3:=6/doc/stuff)) -(test-cmp (build-path 'same "x.ss") "x.ss" (build-path 'same)) +(test-cmp (build-path 'same "x.rkt") "x.rkt" (build-path 'same)) +(test-cmp (build-path 'same "x.rkt") "x.ss" (build-path 'same)) +(test-cmp (build-path 'same "x.scm") "x.scm" (build-path 'same)) -(test '(lib "bar/foo.ss") +(test '(lib "bar/foo.rkt") collapse-module-path-index (module-path-index-join '(lib "foo.ss" "bar") (make-resolved-module-path 'nowhere)) (current-directory)) -(test (build-path (find-system-path 'temp-dir) "data.ss") +(test (build-path (find-system-path 'temp-dir) "data.rkt") collapse-module-path-index (module-path-index-join '"data.ss" (make-resolved-module-path (build-path (find-system-path 'temp-dir) "prog.ss"))) @@ -140,14 +245,14 @@ ;; Try path cases that don't fit UTF-8 (and therefore would go wrong as a string): (let ([dir (build-path (current-directory) (bytes->path #"\xFF"))]) - (test-cmp (build-path dir "x.ss") + (test-cmp (build-path dir "x.rkt") "x.ss" (build-path dir "other"))) (test-cmp (build-path (current-directory) (bytes->path #"\xFF")) (bytes->path #"\xFF") `(file ,(path->string (build-path (current-directory) "other")))) -(test '(lib "alsonot/x.ss") +(test '(lib "alsonot/x.rkt") collapse-module-path-index (module-path-index-join "x.ss" (module-path-index-join diff --git a/src/mzscheme/gc2/setup.ss b/src/mzscheme/gc2/setup.ss index 35bff36c39..e7939961c5 100644 --- a/src/mzscheme/gc2/setup.ss +++ b/src/mzscheme/gc2/setup.ss @@ -35,22 +35,33 @@ (resolve-module-path-index mod-path rel-to) (resolve-module-path mod-path rel-to)))]) (unless (symbol? path) - ;; Copy file to here: - (let ([target - (or target - (let-values ([(src-base rel-path) - (let loop ([path (simplify-path path)][accum null]) - (let-values ([(base name dir?) (split-path path)]) - (if (string=? (path->string name) "collects") - (values base (cons "xform-collects" accum)) - (loop base (cons name accum)))))]) - (let loop ([place (current-directory)][rel-path rel-path]) - (if (null? (cdr rel-path)) - (build-path place (car rel-path)) - (let ([next (build-path place (car rel-path))]) - (unless (directory-exists? next) - (make-directory next)) - (loop next (cdr rel-path)))))))]) + ;; Copy file to here. The filename is from the resolved module + ;; path, so it is ".rkt" even if the source is ".ss". + (let* ([path (if (file-exists? path) + path + (if (regexp-match? #rx#"[.]rkt$" (if (path? path) + (path->bytes path) + path)) + (let ([p2 (path-replace-suffix path #".ss")]) + (if (file-exists? p2) + p2 + path)) + path))] + [target + (or target + (let-values ([(src-base rel-path) + (let loop ([path (simplify-path path)][accum null]) + (let-values ([(base name dir?) (split-path path)]) + (if (string=? (path->string name) "collects") + (values base (cons "xform-collects" accum)) + (loop base (cons name accum)))))]) + (let loop ([place (current-directory)][rel-path rel-path]) + (if (null? (cdr rel-path)) + (build-path place (car rel-path)) + (let ([next (build-path place (car rel-path))]) + (unless (directory-exists? next) + (make-directory next)) + (loop next (cdr rel-path)))))))]) (unless (file-exists? target) (printf "Copying ~a to ~a~n" path target) (copy-file path target) diff --git a/src/mzscheme/src/cstartup.inc b/src/mzscheme/src/cstartup.inc index a5f636a222..df4d95ef26 100644 --- a/src/mzscheme/src/cstartup.inc +++ b/src/mzscheme/src/cstartup.inc @@ -1,43 +1,43 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,55,50,0,0,0,1,0,0,3,0,12,0, -17,0,21,0,24,0,37,0,44,0,49,0,53,0,60,0,65,0,72,0,78, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,56,50,0,0,0,1,0,0,3,0,12,0, +16,0,21,0,28,0,41,0,48,0,53,0,58,0,62,0,69,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, 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, 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,64,108,101,116,42,63,108,101,116,62,111,114,72,112, -97,114,97,109,101,116,101,114,105,122,101,66,100,101,102,105,110,101,64,99,111, -110,100,63,97,110,100,66,117,110,108,101,115,115,64,119,104,101,110,66,108,101, -116,114,101,99,65,113,117,111,116,101,29,94,2,13,68,35,37,107,101,114,110, +101,114,101,45,115,116,120,63,108,101,116,64,99,111,110,100,66,117,110,108,101, +115,115,72,112,97,114,97,109,101,116,101,114,105,122,101,66,100,101,102,105,110, +101,64,119,104,101,110,64,108,101,116,42,63,97,110,100,66,108,101,116,114,101, +99,62,111,114,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, 98,101,103,105,110,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117,101, 115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109, 98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, 45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,97, -36,11,8,240,47,75,0,0,95,159,2,15,36,36,159,2,14,36,36,159,2, -14,36,36,16,20,2,4,2,1,2,5,2,1,2,6,2,1,2,7,2,1, -2,3,2,1,2,9,2,1,2,8,2,1,2,10,2,1,2,11,2,1,2, -12,2,1,97,37,11,8,240,47,75,0,0,93,159,2,14,36,37,16,2,2, -2,161,2,1,37,2,2,2,1,2,2,96,38,11,8,240,47,75,0,0,16, -0,96,11,11,8,240,47,75,0,0,16,0,13,16,4,36,29,11,11,2,1, +36,11,8,240,115,76,0,0,95,159,2,15,36,36,159,2,14,36,36,159,2, +14,36,36,16,20,2,3,2,1,2,5,2,1,2,7,2,1,2,6,2,1, +2,8,2,1,2,9,2,1,2,10,2,1,2,4,2,1,2,11,2,1,2, +12,2,1,97,37,11,8,240,115,76,0,0,93,159,2,14,36,37,16,2,2, +2,161,2,1,37,2,2,2,1,2,2,96,11,11,8,240,115,76,0,0,16, +0,96,38,11,8,240,115,76,0,0,16,0,13,16,4,36,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, -8,224,54,75,0,0,95,9,8,224,54,75,0,0,2,1,27,248,22,143,4, +8,224,122,76,0,0,95,9,8,224,122,76,0,0,2,1,27,248,22,143,4, 195,249,22,136,4,80,158,39,36,251,22,81,2,16,248,22,96,199,12,249,22, 71,2,17,248,22,98,201,27,248,22,143,4,195,249,22,136,4,80,158,39,36, 251,22,81,2,16,248,22,96,199,249,22,71,2,17,248,22,98,201,12,27,248, 22,73,248,22,143,4,196,28,248,22,79,193,20,15,159,37,36,37,28,248,22, 79,248,22,73,194,248,22,72,193,249,22,136,4,80,158,39,36,251,22,81,2, -16,248,22,72,199,249,22,71,2,9,248,22,73,201,11,18,16,2,101,10,8, +16,248,22,72,199,249,22,71,2,10,248,22,73,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, -49,50,51,56,49,16,4,11,11,2,19,3,1,8,101,110,118,49,50,51,56, -50,93,8,224,55,75,0,0,95,9,8,224,55,75,0,0,2,1,27,248,22, +49,50,55,51,54,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,51, +55,93,8,224,123,76,0,0,95,9,8,224,123,76,0,0,2,1,27,248,22, 73,248,22,143,4,196,28,248,22,79,193,20,15,159,37,36,37,28,248,22,79, 248,22,73,194,248,22,72,193,249,22,136,4,80,158,39,36,250,22,81,2,20, 248,22,81,249,22,81,248,22,81,2,21,248,22,72,201,251,22,81,2,16,2, -21,2,21,249,22,71,2,5,248,22,73,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,51, -56,52,16,4,11,11,2,19,3,1,8,101,110,118,49,50,51,56,53,93,8, -224,56,75,0,0,95,9,8,224,56,75,0,0,2,1,248,22,143,4,193,27, +21,2,21,249,22,71,2,12,248,22,73,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, +51,57,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,52,48,93,8, +224,124,76,0,0,95,9,8,224,124,76,0,0,2,1,248,22,143,4,193,27, 248,22,143,4,194,249,22,71,248,22,81,248,22,72,196,248,22,73,195,27,248, 22,73,248,22,143,4,23,197,1,249,22,136,4,80,158,39,36,28,248,22,56, 248,22,137,4,248,22,72,23,198,2,27,249,22,2,32,0,89,162,8,44,37, @@ -51,8 +51,8 @@ 249,22,2,32,0,89,162,8,44,37,47,9,222,33,42,248,22,143,4,248,22, 72,201,248,22,73,198,27,248,22,73,248,22,143,4,196,27,248,22,143,4,248, 22,72,195,249,22,136,4,80,158,40,36,28,248,22,79,195,250,22,82,2,20, -9,248,22,73,199,250,22,81,2,4,248,22,81,248,22,72,199,250,22,82,2, -3,248,22,73,201,248,22,73,202,27,248,22,73,248,22,143,4,23,197,1,27, +9,248,22,73,199,250,22,81,2,3,248,22,81,248,22,72,199,250,22,82,2, +9,248,22,73,201,248,22,73,202,27,248,22,73,248,22,143,4,23,197,1,27, 249,22,1,22,85,249,22,2,22,143,4,248,22,143,4,248,22,72,199,249,22, 136,4,80,158,40,36,251,22,81,1,22,119,105,116,104,45,99,111,110,116,105, 110,117,97,116,105,111,110,45,109,97,114,107,2,24,250,22,82,1,23,101,120, @@ -62,14 +62,14 @@ 22,73,203,27,248,22,73,248,22,143,4,196,28,248,22,79,193,20,15,159,37, 36,37,249,22,136,4,80,158,39,36,27,248,22,143,4,248,22,72,197,28,249, 22,176,8,62,61,62,248,22,137,4,248,22,96,196,250,22,81,2,20,248,22, -81,249,22,81,21,93,2,25,248,22,72,199,250,22,82,2,8,249,22,81,2, +81,249,22,81,21,93,2,25,248,22,72,199,250,22,82,2,4,249,22,81,2, 25,249,22,81,248,22,105,203,2,25,248,22,73,202,251,22,81,2,16,28,249, 22,176,8,248,22,137,4,248,22,72,200,64,101,108,115,101,10,248,22,72,197, -250,22,82,2,20,9,248,22,73,200,249,22,71,2,8,248,22,73,202,100,8, +250,22,82,2,20,9,248,22,73,200,249,22,71,2,4,248,22,73,202,100,8, 31,8,30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118, -49,50,52,48,55,16,4,11,11,2,19,3,1,8,101,110,118,49,50,52,48, -56,93,8,224,57,75,0,0,18,16,2,158,94,10,64,118,111,105,100,8,47, -95,9,8,224,57,75,0,0,2,1,27,248,22,73,248,22,143,4,196,249,22, +49,50,55,54,50,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,54, +51,93,8,224,125,76,0,0,18,16,2,158,94,10,64,118,111,105,100,8,47, +95,9,8,224,125,76,0,0,2,1,27,248,22,73,248,22,143,4,196,249,22, 136,4,80,158,39,36,28,248,22,56,248,22,137,4,248,22,72,197,250,22,81, 2,26,248,22,81,248,22,72,199,248,22,96,198,27,248,22,137,4,248,22,72, 197,250,22,81,2,26,248,22,81,248,22,72,197,250,22,82,2,23,248,22,73, @@ -81,17 +81,17 @@ 2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,36, 46,37,11,11,11,16,0,16,0,16,0,36,36,11,11,11,11,16,0,16,0, 16,0,36,36,16,11,16,5,2,2,20,15,159,36,36,36,36,20,105,159,36, -16,0,16,1,33,32,10,16,5,2,10,89,162,8,44,37,53,9,223,0,33, -33,36,20,105,159,36,16,1,2,2,16,0,11,16,5,2,11,89,162,8,44, +16,0,16,1,33,32,10,16,5,2,5,89,162,8,44,37,53,9,223,0,33, +33,36,20,105,159,36,16,1,2,2,16,0,11,16,5,2,8,89,162,8,44, 37,53,9,223,0,33,34,36,20,105,159,36,16,1,2,2,16,0,11,16,5, -2,9,89,162,8,44,37,53,9,223,0,33,35,36,20,105,159,36,16,1,2, -2,16,1,33,36,11,16,5,2,5,89,162,8,44,37,56,9,223,0,33,37, -36,20,105,159,36,16,1,2,2,16,1,33,38,11,16,5,2,4,89,162,8, +2,10,89,162,8,44,37,53,9,223,0,33,35,36,20,105,159,36,16,1,2, +2,16,1,33,36,11,16,5,2,12,89,162,8,44,37,56,9,223,0,33,37, +36,20,105,159,36,16,1,2,2,16,1,33,38,11,16,5,2,3,89,162,8, 44,37,58,9,223,0,33,41,36,20,105,159,36,16,1,2,2,16,0,11,16, -5,2,12,89,162,8,44,37,53,9,223,0,33,43,36,20,105,159,36,16,1, -2,2,16,0,11,16,5,2,3,89,162,8,44,37,54,9,223,0,33,44,36, +5,2,11,89,162,8,44,37,53,9,223,0,33,43,36,20,105,159,36,16,1, +2,2,16,0,11,16,5,2,9,89,162,8,44,37,54,9,223,0,33,44,36, 20,105,159,36,16,1,2,2,16,0,11,16,5,2,6,89,162,8,44,37,55, -9,223,0,33,45,36,20,105,159,36,16,1,2,2,16,0,11,16,5,2,8, +9,223,0,33,45,36,20,105,159,36,16,1,2,2,16,0,11,16,5,2,4, 89,162,8,44,37,58,9,223,0,33,46,36,20,105,159,36,16,1,2,2,16, 1,33,48,11,16,5,2,7,89,162,8,44,37,54,9,223,0,33,49,36,20, 105,159,36,16,1,2,2,16,0,11,16,0,94,2,14,2,15,93,2,14,9, @@ -99,7 +99,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 2018); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,55,64,0,0,0,1,0,0,13,0,18,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,56,64,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, 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,180,2,14,4,55,4,128,5,214,5,44, @@ -400,12 +400,12 @@ EVAL_ONE_SIZED_STR((char *)expr, 6239); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,55,8,0,0,0,1,0,0,6,0,19,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,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,53,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, 110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122, 11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68,35, -37,107,101,114,110,101,108,11,97,36,11,8,240,181,75,0,0,98,159,2,2, +37,107,101,114,110,101,108,11,97,36,11,8,240,249,76,0,0,98,159,2,2, 36,36,159,2,3,36,36,159,2,4,36,36,159,2,5,36,36,159,2,6,36, 36,159,2,6,36,36,16,0,159,36,20,105,159,36,16,1,11,16,0,83,158, 42,20,103,144,69,35,37,98,117,105,108,116,105,110,29,11,11,11,11,11,18, @@ -420,271 +420,316 @@ EVAL_ONE_SIZED_STR((char *)expr, 346); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,55,65,0,0,0,1,0,0,11,0,38,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,56,73,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, -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,114,1,144,1,175,1,232,1,24,2,64,4,83, -4,96,4,254,4,10,5,144,5,186,6,53,7,59,7,73,7,85,7,175,7, -188,7,51,8,63,8,153,8,166,8,29,9,56,9,68,9,158,9,171,9,34, -10,47,10,166,10,174,10,3,11,5,11,74,11,69,18,121,18,144,18,0,0, -49,21,0,0,70,100,108,108,45,115,117,102,102,105,120,1,25,100,101,102,97, -117,108,116,45,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100, -65,113,117,111,116,101,29,94,2,3,67,35,37,117,116,105,108,115,11,68,35, -37,112,97,114,97,109,122,29,94,2,3,2,5,11,1,20,112,97,114,97,109, -101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,1,20,100,101,102,97, -117,108,116,45,114,101,97,100,101,114,45,103,117,97,114,100,1,24,45,109,111, -100,117,108,101,45,104,97,115,104,45,116,97,98,108,101,45,116,97,98,108,101, -71,45,112,97,116,104,45,99,97,99,104,101,77,45,108,111,97,100,105,110,103, -45,102,105,108,101,110,97,109,101,79,45,108,111,97,100,105,110,103,45,112,114, -111,109,112,116,45,116,97,103,71,45,112,114,101,118,45,114,101,108,116,111,75, -45,112,114,101,118,45,114,101,108,116,111,45,100,105,114,1,21,115,112,108,105, -116,45,114,101,108,97,116,105,118,101,45,115,116,114,105,110,103,71,111,114,105, -103,45,112,97,114,97,109,122,1,29,115,116,97,110,100,97,114,100,45,109,111, -100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,29,94,2, -3,2,5,11,64,98,111,111,116,64,115,101,97,108,64,115,97,109,101,5,3, +0,221,0,244,0,0,1,31,1,38,1,43,1,48,1,53,1,58,1,63,1, +72,1,77,1,81,1,87,1,94,1,100,1,108,1,117,1,138,1,159,1,189, +1,219,1,20,2,77,2,125,2,173,2,220,6,239,6,252,6,154,7,166,7, +44,8,86,9,209,9,215,9,229,9,241,9,75,10,88,10,207,10,219,10,53, +11,66,11,185,11,212,11,225,11,237,11,71,12,84,12,203,12,216,12,79,13, +87,13,172,13,174,13,243,13,237,21,33,22,56,22,0,0,217,24,0,0,70, +100,108,108,45,115,117,102,102,105,120,1,25,100,101,102,97,117,108,116,45,108, +111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,65,113,117,111,116, +101,29,94,2,3,67,35,37,117,116,105,108,115,11,68,35,37,112,97,114,97, +109,122,29,94,2,3,2,5,11,1,20,112,97,114,97,109,101,116,101,114,105, +122,97,116,105,111,110,45,107,101,121,1,20,100,101,102,97,117,108,116,45,114, +101,97,100,101,114,45,103,117,97,114,100,1,24,45,109,111,100,117,108,101,45, +104,97,115,104,45,116,97,98,108,101,45,116,97,98,108,101,71,45,112,97,116, +104,45,99,97,99,104,101,77,45,108,111,97,100,105,110,103,45,102,105,108,101, +110,97,109,101,79,45,108,111,97,100,105,110,103,45,112,114,111,109,112,116,45, +116,97,103,71,45,112,114,101,118,45,114,101,108,116,111,75,45,112,114,101,118, +45,114,101,108,116,111,45,100,105,114,1,21,115,112,108,105,116,45,114,101,108, +97,116,105,118,101,45,115,116,114,105,110,103,71,111,114,105,103,45,112,97,114, +97,109,122,1,29,115,116,97,110,100,97,114,100,45,109,111,100,117,108,101,45, +110,97,109,101,45,114,101,115,111,108,118,101,114,29,94,2,3,2,5,11,64, +98,111,111,116,64,115,101,97,108,64,115,97,109,101,5,3,46,122,111,5,3, 46,122,111,6,6,6,110,97,116,105,118,101,64,108,111,111,112,63,108,105,98, -67,105,103,110,111,114,101,100,249,22,14,195,80,159,38,46,38,250,22,187,13, -23,197,1,23,199,1,249,80,159,43,39,38,23,198,1,2,22,252,22,187,13, -23,199,1,23,201,1,2,23,247,22,190,7,249,80,159,45,39,38,23,200,1, -80,159,45,36,38,87,94,23,194,1,27,250,22,140,14,196,11,32,0,89,162, -8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,252,22,187,13,23, -200,1,23,202,1,2,23,247,22,190,7,249,80,159,46,39,38,23,201,1,80, -159,46,36,38,27,250,22,140,14,196,11,32,0,89,162,8,44,36,41,9,222, -11,28,192,249,22,71,195,194,11,27,250,22,187,13,23,198,1,23,200,1,249, -80,159,44,39,38,23,199,1,2,22,27,250,22,140,14,196,11,32,0,89,162, -8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,87,94,28,248,80,159, -37,38,38,23,195,2,12,250,22,146,9,77,108,111,97,100,47,117,115,101,45, -99,111,109,112,105,108,101,100,6,25,25,112,97,116,104,32,111,114,32,118,97, -108,105,100,45,112,97,116,104,32,115,116,114,105,110,103,23,197,2,91,159,42, -11,90,161,37,36,11,28,248,22,129,14,23,201,2,23,200,1,27,247,22,138, -5,28,23,193,2,249,22,130,14,23,203,1,23,195,1,200,90,161,39,37,11, -248,22,190,13,23,194,2,87,94,23,196,1,90,161,37,40,11,28,249,22,176, -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,37,41,11,247,22,148,14,27,89,162,44,37,50,62,122,111,225, -7,5,3,33,28,27,89,162,44,37,52,9,225,8,6,4,33,29,27,249,22, -5,89,162,8,44,37,47,9,223,5,33,30,23,203,2,27,28,23,195,1,27, -249,22,5,89,162,8,44,37,53,9,225,13,11,9,33,31,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, -73,196,248,22,73,23,199,2,193,11,11,11,11,28,23,193,2,87,98,23,202, -1,23,199,1,23,197,1,23,196,1,23,194,1,20,14,159,80,159,46,40,38, -250,80,159,49,41,38,249,22,27,11,80,159,51,40,38,22,138,5,28,248,22, -169,13,23,205,2,23,204,1,87,94,23,204,1,247,22,146,14,249,247,22,151, -14,248,22,72,195,206,87,94,23,193,1,27,28,23,197,1,27,249,22,5,83, -158,40,20,100,94,89,162,8,44,37,51,9,225,14,12,10,33,32,23,203,1, -23,206,1,27,28,23,197,2,11,193,28,192,192,28,193,28,196,28,249,22,176, -3,248,22,73,196,248,22,73,199,193,11,11,11,87,95,23,203,1,23,200,1, -11,28,23,193,2,87,94,23,198,1,20,14,159,80,159,47,40,38,250,80,159, -50,41,38,249,22,27,11,80,159,52,40,38,22,138,5,28,248,22,169,13,23, -206,2,23,205,1,87,94,23,205,1,247,22,146,14,249,247,22,136,5,248,22, -72,195,23,15,87,94,23,193,1,20,14,159,80,159,47,40,38,250,80,159,50, -41,38,249,22,27,11,80,159,52,40,38,22,138,5,28,248,22,169,13,23,206, -2,23,205,1,87,94,23,205,1,247,22,146,14,249,247,22,136,5,199,23,15, -0,17,35,114,120,34,94,40,46,42,63,41,47,40,46,42,41,36,34,32,35, -89,162,8,44,37,59,2,24,222,33,36,27,249,22,156,14,2,34,23,196,2, -28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22, -105,23,197,1,27,249,22,156,14,2,34,23,196,2,28,23,193,2,87,94,23, -194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22, -156,14,2,34,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, -96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14,2,34,23,196,2, -28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,35, -248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,248,22,81, -194,32,37,89,162,44,37,55,2,24,222,33,38,28,248,22,79,248,22,73,23, -195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,27,248, -22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195, -91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73, -23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248, -2,37,248,22,73,196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7, -249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22,72,199,196,195, -27,27,249,22,156,14,2,34,23,197,2,28,23,193,2,87,94,23,195,1,249, -22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14,2, -34,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196, -2,27,248,22,105,23,197,1,27,249,22,156,14,2,34,23,196,2,28,23,193, -2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197, -1,27,249,22,156,14,2,34,23,196,2,28,23,193,2,87,94,23,194,1,249, -22,71,248,22,96,23,196,2,248,2,35,248,22,105,23,197,1,248,22,81,194, -248,22,81,194,248,22,81,194,248,22,81,195,28,23,195,1,192,28,248,22,79, -248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38, -36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9, -248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248,22, -79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161, -38,36,11,248,2,37,248,22,73,196,249,22,7,249,22,71,248,22,72,199,196, -195,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22, -72,199,196,195,87,95,28,248,22,180,4,195,12,250,22,146,9,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,27,250,22,146, -2,80,159,42,43,38,248,22,176,14,247,22,149,12,11,28,23,193,2,192,87, -94,23,193,1,27,247,22,130,2,87,94,250,22,144,2,80,159,43,43,38,248, -22,176,14,247,22,149,12,195,192,250,22,144,2,195,198,66,97,116,116,97,99, -104,251,211,197,198,199,10,28,192,250,22,145,9,11,196,195,248,22,143,9,194, -32,43,89,162,44,37,52,2,24,222,33,44,28,248,22,79,248,22,73,23,195, -2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22, -73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91, -159,38,11,90,161,38,36,11,248,2,43,248,22,73,196,249,22,7,249,22,71, -248,22,72,199,196,195,249,22,7,249,22,71,248,22,72,199,196,195,32,45,89, -162,8,44,37,55,2,24,222,33,46,27,249,22,156,14,2,34,23,196,2,28, -23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105, -23,197,1,27,249,22,156,14,2,34,23,196,2,28,23,193,2,87,94,23,194, -1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,156, -14,2,34,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96, -23,196,2,248,2,45,248,22,105,23,197,1,248,22,81,194,248,22,81,194,248, -22,81,194,32,47,89,162,44,37,52,2,24,222,33,48,28,248,22,79,248,22, +6,3,3,46,115,115,6,4,4,46,114,107,116,5,4,46,114,107,116,67,105, +103,110,111,114,101,100,249,22,14,195,80,159,38,46,38,250,22,187,13,23,197, +1,23,199,1,249,80,159,43,39,38,23,198,1,2,22,250,22,187,13,23,197, +1,23,199,1,249,80,159,43,39,38,23,198,1,2,23,252,22,187,13,23,199, +1,23,201,1,2,24,247,22,190,7,249,80,159,45,39,38,23,200,1,80,159, +45,36,38,252,22,187,13,23,199,1,23,201,1,2,24,247,22,190,7,249,80, +159,45,39,38,23,200,1,80,159,45,36,38,27,252,22,187,13,23,200,1,23, +202,1,2,24,247,22,190,7,249,80,159,46,39,38,23,201,1,80,159,46,36, +38,27,250,22,140,14,196,11,32,0,89,162,8,44,36,41,9,222,11,28,192, +249,22,71,195,194,11,27,252,22,187,13,23,200,1,23,202,1,2,24,247,22, +190,7,249,80,159,46,39,38,23,201,1,80,159,46,36,38,27,250,22,140,14, +196,11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11, +27,250,22,187,13,23,198,1,23,200,1,249,80,159,44,39,38,23,199,1,2, +22,27,250,22,140,14,196,11,32,0,89,162,8,44,36,41,9,222,11,28,192, +249,22,71,195,194,11,27,250,22,187,13,23,198,1,23,200,1,249,80,159,44, +39,38,23,199,1,2,23,27,250,22,140,14,196,11,32,0,89,162,8,44,36, +41,9,222,11,28,192,249,22,71,195,194,11,87,94,28,248,80,159,37,38,38, +23,195,2,12,250,22,146,9,77,108,111,97,100,47,117,115,101,45,99,111,109, +112,105,108,101,100,6,25,25,112,97,116,104,32,111,114,32,118,97,108,105,100, +45,112,97,116,104,32,115,116,114,105,110,103,23,197,2,91,159,46,11,90,161, +37,36,11,28,248,22,129,14,23,205,2,23,204,2,27,247,22,138,5,28,23, +193,2,249,22,130,14,23,207,2,23,195,1,23,205,2,90,161,39,37,11,248, +22,190,13,23,205,1,87,94,23,196,1,90,161,38,40,11,28,23,205,2,27, +248,22,174,13,23,197,2,27,248,22,161,7,23,195,2,28,28,249,22,176,3, +23,195,2,40,249,22,164,7,5,4,46,114,107,116,249,22,167,7,23,198,2, +249,22,164,3,23,199,2,40,11,249,22,7,23,199,2,248,22,178,13,249,22, +168,7,250,22,167,7,23,202,1,36,249,22,164,3,23,203,1,40,5,3,46, +115,115,249,22,7,23,199,2,11,249,22,7,23,197,2,11,90,161,37,42,11, +28,249,22,176,8,23,199,2,23,197,2,23,193,2,249,22,187,13,23,196,2, +23,199,2,90,161,37,43,11,28,23,198,2,28,249,22,176,8,23,200,2,23, +197,1,23,193,1,87,94,23,193,1,249,22,187,13,23,196,2,23,200,2,87, +94,23,195,1,11,90,161,37,44,11,28,249,22,176,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,37,45,11, +247,22,148,14,27,27,250,22,140,14,23,204,2,11,32,0,89,162,8,44,36, +41,9,222,11,28,192,249,22,71,23,203,2,194,11,27,28,23,202,2,28,23, +194,2,11,27,250,22,140,14,23,206,2,11,32,0,89,162,8,44,36,41,9, +222,11,28,192,249,22,71,23,205,2,194,11,11,27,28,23,195,2,23,195,2, +23,194,2,27,89,162,44,37,50,62,122,111,225,14,12,8,33,32,27,89,162, +44,37,50,66,97,108,116,45,122,111,225,15,13,10,33,33,27,89,162,44,37, +52,9,225,16,14,10,33,34,27,89,162,44,37,52,9,225,17,15,12,33,35, +27,28,23,200,2,23,200,2,248,22,174,8,23,200,2,27,28,23,200,2,87, +94,23,201,1,23,200,2,248,22,174,8,23,202,1,27,27,28,23,196,2,28, +23,198,1,27,249,22,5,89,162,8,44,37,53,9,225,24,22,18,33,36,23, +216,2,27,28,23,203,2,11,193,28,192,192,28,193,28,23,203,2,28,249,22, +176,3,248,22,73,196,248,22,73,23,206,2,193,11,11,11,11,87,94,23,198, +1,11,28,23,193,2,192,87,94,23,193,1,28,23,195,2,28,23,197,1,27, +249,22,5,89,162,8,44,37,53,9,225,24,22,19,33,37,23,216,2,27,28, +203,11,193,28,192,192,28,193,28,203,28,249,22,176,3,248,22,73,196,248,22, +73,206,193,11,11,11,11,11,28,23,193,2,87,103,23,212,1,23,210,1,23, +209,1,23,208,1,23,207,1,23,200,1,23,199,1,23,198,1,23,195,1,23, +194,1,20,14,159,80,159,56,40,38,250,80,159,59,41,38,249,22,27,11,80, +159,8,25,40,38,22,138,5,28,248,22,169,13,23,215,2,23,214,1,87,94, +23,214,1,247,22,146,14,249,247,22,151,14,248,22,72,195,23,24,87,94,23, +193,1,27,27,28,23,197,2,28,23,201,1,27,249,22,5,83,158,40,20,100, +94,89,162,8,44,37,51,9,225,25,23,19,33,38,23,212,1,23,217,2,27, +28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28,249,22,176,3,248, +22,73,196,248,22,73,23,207,2,193,11,11,11,87,94,23,209,1,11,87,94, +23,201,1,11,28,23,193,2,192,87,94,23,193,1,28,23,196,1,28,23,200, +1,27,249,22,5,83,158,40,20,100,94,89,162,8,44,37,51,9,225,25,23, +20,33,39,23,213,1,23,217,1,27,28,203,11,193,28,192,192,28,193,28,203, +28,249,22,176,3,248,22,73,196,248,22,73,206,193,11,11,11,11,11,28,23, +193,2,87,96,23,211,1,23,210,1,23,196,1,20,14,159,80,159,57,40,38, +250,80,159,8,24,41,38,249,22,27,11,80,159,8,26,40,38,22,138,5,28, +248,22,169,13,23,216,2,23,215,1,87,94,23,215,1,247,22,146,14,249,247, +22,136,5,248,22,72,195,23,25,87,94,23,193,1,20,14,159,80,159,57,40, +38,250,80,159,8,24,41,38,249,22,27,11,80,159,8,26,40,38,22,138,5, +28,248,22,169,13,23,216,2,23,215,1,87,94,23,215,1,247,22,146,14,249, +247,22,136,5,28,197,23,19,23,20,23,25,0,17,35,114,120,34,94,40,46, +42,63,41,47,40,46,42,41,36,34,32,42,89,162,8,44,37,59,2,25,222, +33,43,27,249,22,156,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1, +249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14, +2,41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23, +196,2,27,248,22,105,23,197,1,27,249,22,156,14,2,41,23,196,2,28,23, +193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23, +197,1,27,249,22,156,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1, +249,22,71,248,22,96,23,196,2,248,2,42,248,22,105,23,197,1,248,22,81, +194,248,22,81,194,248,22,81,194,248,22,81,194,32,44,89,162,44,37,55,2, +25,222,33,45,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72, +195,91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248,22,79,248,22, 73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11, 27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22, -72,195,91,159,38,11,90,161,38,36,11,248,2,47,248,22,73,196,249,22,7, +72,195,91,159,38,11,90,161,38,36,11,248,2,44,248,22,73,196,249,22,7, 249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22,72,199,196,195, -32,49,89,162,8,44,37,55,2,24,222,33,50,27,249,22,156,14,2,34,23, -196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27, -248,22,105,23,197,1,27,249,22,156,14,2,34,23,196,2,28,23,193,2,87, +249,22,7,249,22,71,248,22,72,199,196,195,27,27,249,22,156,14,2,41,23, +197,2,28,23,193,2,87,94,23,195,1,249,22,71,248,22,96,23,196,2,27, +248,22,105,23,197,1,27,249,22,156,14,2,41,23,196,2,28,23,193,2,87, 94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27, -249,22,156,14,2,34,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71, -248,22,96,23,196,2,248,2,49,248,22,105,23,197,1,248,22,81,194,248,22, -81,194,248,22,81,194,28,249,22,176,6,194,6,1,1,46,2,21,28,249,22, -176,6,194,6,2,2,46,46,62,117,112,192,32,52,89,162,44,37,52,2,24, -222,33,53,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195, +249,22,156,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71, +248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14,2,41,23, +196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248, +2,42,248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,248, +22,81,195,28,23,195,1,192,28,248,22,79,248,22,73,23,195,2,249,22,7, +9,248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248, +22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90, +161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22, +7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,44,248,22,73, +196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22, +72,199,196,195,249,22,7,249,22,71,248,22,72,199,196,195,87,95,28,248,22, +180,4,195,12,250,22,146,9,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,27,250,22,146,2,80,159,42,43,38,248,22,176, +14,247,22,149,12,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,2, +87,94,250,22,144,2,80,159,43,43,38,248,22,176,14,247,22,149,12,195,192, +250,22,144,2,195,198,66,97,116,116,97,99,104,251,211,197,198,199,10,28,192, +250,22,145,9,11,196,195,248,22,143,9,194,32,50,89,162,44,37,52,2,25, +222,33,51,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195, 91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73, 23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248, -2,52,248,22,73,196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7, -249,22,71,248,22,72,199,196,195,32,54,89,162,8,44,37,55,2,24,222,33, -55,27,249,22,156,14,2,34,23,196,2,28,23,193,2,87,94,23,194,1,249, +2,50,248,22,73,196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7, +249,22,71,248,22,72,199,196,195,32,52,89,162,8,44,37,55,2,25,222,33, +53,27,249,22,156,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1,249, 22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14,2, -34,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196, -2,27,248,22,105,23,197,1,27,249,22,156,14,2,34,23,196,2,28,23,193, -2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,54,248,22,105, -23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,32,56,89,162,8,44, -37,55,2,24,222,33,57,27,249,22,156,14,2,34,23,196,2,28,23,193,2, -87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1, -27,249,22,156,14,2,34,23,196,2,28,23,193,2,87,94,23,194,1,249,22, -71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14,2,34, -23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2, -248,2,56,248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194, -27,248,2,56,23,195,1,192,28,249,22,178,8,248,22,73,23,200,2,23,197, -1,28,249,22,176,8,248,22,72,23,200,2,23,196,1,251,22,143,9,2,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,73,248,22,86,249,22, -71,23,206,1,23,202,1,12,12,247,192,20,14,159,80,159,40,45,38,249,22, -71,248,22,176,14,247,22,149,12,23,197,1,20,14,159,80,159,40,40,38,250, -80,159,43,41,38,249,22,27,11,80,159,45,40,38,22,162,4,23,196,1,249, -247,22,137,5,23,198,1,248,22,59,248,22,173,13,23,198,1,87,94,28,28, -248,22,169,13,23,196,2,10,248,22,188,4,23,196,2,12,28,23,197,2,250, -22,145,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,146,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,69,23,196, -2,249,22,176,8,248,22,72,23,198,2,2,3,11,248,22,181,4,248,22,96, -196,28,28,248,22,69,23,196,2,249,22,176,8,248,22,72,23,198,2,66,112, -108,97,110,101,116,11,87,94,28,207,12,20,14,159,80,159,37,52,38,80,158, -37,50,90,161,37,36,10,249,22,163,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,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,42,50,87,94,23,193,1,27,89,162, -8,44,37,46,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45, -101,114,114,223,5,33,42,27,28,248,22,56,23,198,2,27,250,22,146,2,80, -159,43,44,38,249,22,71,23,203,2,247,22,147,14,11,28,23,193,2,192,87, -94,23,193,1,91,159,38,11,90,161,38,36,11,27,248,22,62,23,202,2,248, -2,43,248,2,45,23,195,1,27,251,80,159,47,53,38,2,17,23,202,1,28, -248,22,79,23,199,2,23,199,2,248,22,72,23,199,2,28,248,22,79,23,199, -2,9,248,22,73,23,199,2,249,22,187,13,23,195,1,28,248,22,79,23,197, -1,87,94,23,197,1,6,7,7,109,97,105,110,46,115,115,249,22,129,7,23, -199,1,6,3,3,46,115,115,28,248,22,170,6,23,198,2,87,94,23,194,1, -27,27,28,23,200,2,28,249,22,176,8,23,202,2,80,158,43,47,80,158,41, -48,27,248,22,182,4,23,202,2,28,248,22,169,13,23,194,2,91,159,39,11, -90,161,39,36,11,248,22,190,13,23,197,1,87,95,83,160,38,11,80,158,45, -47,23,204,2,83,160,38,11,80,158,45,48,192,192,11,11,28,23,193,2,192, -87,94,23,193,1,27,247,22,138,5,28,23,193,2,192,87,94,23,193,1,247, -22,146,14,27,250,22,146,2,80,159,44,44,38,249,22,71,23,204,2,23,199, -2,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90,161,38,36,11, -248,2,47,248,2,49,23,203,2,250,22,1,22,187,13,23,199,1,249,22,85, -249,22,2,32,0,89,162,8,44,37,44,9,222,33,51,23,200,1,248,22,81, -23,200,1,28,248,22,169,13,23,198,2,87,94,23,194,1,28,248,22,128,14, -23,198,2,23,197,2,248,22,81,6,26,26,32,40,97,32,112,97,116,104,32, -109,117,115,116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22,176, -8,248,22,72,23,200,2,2,25,27,250,22,146,2,80,159,43,44,38,249,22, -71,23,203,2,247,22,147,14,11,28,23,193,2,192,87,94,23,193,1,91,159, -39,11,90,161,38,36,11,27,248,22,96,23,203,2,248,2,52,248,2,54,23, -195,1,90,161,37,38,11,28,248,22,79,248,22,98,23,203,2,28,248,22,79, -23,194,2,249,22,158,14,0,8,35,114,120,34,91,46,93,34,23,196,2,11, -10,27,27,28,23,197,2,249,22,85,28,248,22,79,248,22,98,23,207,2,21, -93,6,5,5,109,122,108,105,98,249,22,1,22,85,249,22,2,32,0,89,162, -8,44,37,44,9,222,33,58,248,22,98,23,210,2,23,197,2,28,248,22,79, -23,196,2,248,22,81,23,197,2,23,195,2,251,80,159,49,53,38,2,17,23, -204,1,248,22,72,23,198,2,248,22,73,23,198,1,249,22,187,13,23,195,1, -28,23,198,1,87,94,23,196,1,23,197,1,28,248,22,79,23,197,1,87,94, -23,197,1,6,7,7,109,97,105,110,46,115,115,28,249,22,158,14,0,8,35, -114,120,34,91,46,93,34,23,199,2,23,197,1,249,22,129,7,23,199,1,6, -3,3,46,115,115,28,249,22,176,8,248,22,72,23,200,2,64,102,105,108,101, -249,22,130,14,248,22,134,14,248,22,96,23,201,2,27,28,23,201,2,28,249, -22,176,8,23,203,2,80,158,44,47,80,158,42,48,27,248,22,182,4,23,203, -2,28,248,22,169,13,23,194,2,91,159,39,11,90,161,39,36,11,248,22,190, -13,23,197,1,87,95,83,160,38,11,80,158,46,47,23,205,2,83,160,38,11, -80,158,46,48,192,192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22, -138,5,28,23,193,2,192,87,94,23,193,1,247,22,146,14,12,87,94,28,28, -248,22,169,13,23,194,2,10,248,22,128,8,23,194,2,87,94,23,199,1,12, -28,23,199,2,250,22,145,9,67,114,101,113,117,105,114,101,249,22,154,7,6, -17,17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23, -198,2,248,22,72,23,199,2,6,0,0,23,202,1,87,94,23,199,1,250,22, -146,9,2,17,249,22,154,7,6,13,13,109,111,100,117,108,101,32,112,97,116, -104,126,97,28,23,198,2,248,22,72,23,199,2,6,0,0,23,200,2,27,28, -248,22,128,8,23,195,2,249,22,133,8,23,196,2,36,249,22,132,14,248,22, -133,14,23,197,2,11,27,28,248,22,128,8,23,196,2,249,22,133,8,23,197, -2,37,248,80,159,42,54,38,23,195,2,91,159,39,11,90,161,39,36,11,28, -248,22,128,8,23,199,2,250,22,7,2,26,249,22,133,8,23,203,2,38,2, -26,248,22,190,13,23,198,2,87,95,23,195,1,23,193,1,27,28,248,22,128, -8,23,200,2,249,22,133,8,23,201,2,39,249,80,159,47,55,38,23,197,2, -5,0,27,28,248,22,128,8,23,201,2,249,22,133,8,23,202,2,40,248,22, -181,4,23,200,2,27,27,250,22,146,2,80,159,51,43,38,248,22,176,14,247, -22,149,12,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,2,87,94, -250,22,144,2,80,159,52,43,38,248,22,176,14,247,22,149,12,195,192,87,95, -28,23,208,1,27,250,22,146,2,23,197,2,197,11,28,23,193,1,12,87,95, -27,27,28,248,22,17,80,159,51,46,38,80,159,50,46,38,247,22,19,250,22, -25,248,22,23,23,197,2,80,159,53,45,38,23,196,1,27,248,22,176,14,247, -22,149,12,249,22,3,83,158,40,20,100,94,89,162,8,44,37,55,9,226,12, -11,2,3,33,59,23,195,1,23,196,1,248,28,248,22,17,80,159,50,46,38, -32,0,89,162,44,37,42,9,222,33,60,80,159,49,59,37,89,162,44,36,51, -9,227,13,9,8,4,3,33,61,250,22,144,2,23,197,1,197,10,12,28,28, -248,22,128,8,23,202,1,11,28,248,22,170,6,23,206,2,10,28,248,22,56, -23,206,2,10,28,248,22,69,23,206,2,249,22,176,8,248,22,72,23,208,2, -2,25,11,250,22,144,2,80,159,50,44,38,28,248,22,170,6,23,209,2,249, -22,71,23,210,1,27,28,23,212,2,28,249,22,176,8,23,214,2,80,158,55, -47,87,94,23,212,1,80,158,53,48,27,248,22,182,4,23,214,2,28,248,22, -169,13,23,194,2,91,159,39,11,90,161,39,36,11,248,22,190,13,23,197,1, -87,95,83,160,38,11,80,158,57,47,23,23,83,160,38,11,80,158,57,48,192, -192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,138,5,28,23,193, -2,192,87,94,23,193,1,247,22,146,14,249,22,71,23,210,1,247,22,147,14, -252,22,130,8,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193,87,96, -83,160,38,11,80,158,36,50,248,80,159,37,58,38,249,22,27,11,80,159,39, -52,38,248,22,161,4,80,159,37,51,38,248,22,137,5,80,159,37,37,37,248, -22,140,13,80,159,37,42,37,83,160,38,11,80,158,36,50,248,80,159,37,58, -38,249,22,27,11,80,159,39,52,38,159,36,20,105,159,36,16,1,11,16,0, -83,158,42,20,103,144,66,35,37,98,111,111,116,29,11,11,11,11,11,10,38, -80,158,36,36,20,105,159,37,16,23,2,1,2,2,30,2,4,72,112,97,116, -104,45,115,116,114,105,110,103,63,10,30,2,4,75,112,97,116,104,45,97,100, -100,45,115,117,102,102,105,120,7,30,2,6,2,7,4,30,2,6,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,3,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2, -17,30,2,18,2,7,4,30,2,4,69,45,102,105,110,100,45,99,111,108,0, -30,2,4,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,6, -30,2,4,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102, -105,120,9,2,19,2,20,30,2,18,74,114,101,112,97,114,97,109,101,116,101, -114,105,122,101,5,16,0,16,0,36,16,0,36,16,12,2,11,2,12,2,9, -2,10,2,13,2,14,2,2,2,8,2,1,2,16,2,15,2,17,48,11,11, -39,36,11,11,11,16,2,2,19,2,20,16,2,11,11,16,2,2,19,2,20, -38,38,37,11,11,11,16,0,16,0,16,0,36,36,11,11,11,11,16,0,16, -0,16,0,36,36,16,0,16,15,83,158,36,16,2,89,162,44,37,45,9,223, -0,33,27,80,159,36,59,37,83,158,36,16,2,248,22,189,7,69,115,111,45, -115,117,102,102,105,120,80,159,36,36,37,83,158,36,16,2,89,162,44,38,8, -24,2,2,223,0,33,33,80,159,36,37,37,83,158,36,16,2,32,0,89,162, -8,44,37,42,2,8,222,192,80,159,36,42,37,83,158,36,16,2,247,22,133, -2,80,159,36,43,37,83,158,36,16,2,247,22,132,2,80,159,36,44,37,83, -158,36,16,2,247,22,67,80,159,36,45,37,83,158,36,16,2,248,22,18,74, -109,111,100,117,108,101,45,108,111,97,100,105,110,103,80,159,36,46,37,83,158, -36,16,2,11,80,158,36,47,83,158,36,16,2,11,80,158,36,48,83,158,36, -16,2,32,0,89,162,44,38,8,25,2,15,222,33,39,80,159,36,49,37,83, -158,36,16,2,11,80,158,36,50,83,158,36,16,2,91,159,38,10,90,161,37, -36,10,11,90,161,37,37,10,83,158,39,20,99,96,2,17,89,162,8,44,37, -51,9,224,2,0,33,40,89,162,44,39,49,9,223,1,33,41,89,162,44,40, -8,32,9,224,2,0,33,62,208,80,159,36,51,37,83,158,36,16,2,89,162, -44,36,45,2,19,223,0,33,63,80,159,36,56,37,83,158,36,16,2,89,162, -8,44,36,45,2,20,223,0,33,64,80,159,36,57,37,96,29,94,2,3,68, -35,37,107,101,114,110,101,108,11,29,94,2,3,69,35,37,109,105,110,45,115, -116,120,11,2,4,2,18,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 5576); +41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196, +2,27,248,22,105,23,197,1,27,249,22,156,14,2,41,23,196,2,28,23,193, +2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,52,248,22,105, +23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,32,54,89,162,44,37, +52,2,25,222,33,55,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248, +22,72,195,91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248,22,79, +248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38, +36,11,248,2,54,248,22,73,196,249,22,7,249,22,71,248,22,72,199,196,195, +249,22,7,249,22,71,248,22,72,199,196,195,32,56,89,162,8,44,37,55,2, +25,222,33,57,27,249,22,156,14,2,41,23,196,2,28,23,193,2,87,94,23, +194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22, +156,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, +96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14,2,41,23,196,2, +28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,56, +248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,28,249,22, +176,6,194,6,1,1,46,2,21,28,249,22,176,6,194,6,2,2,46,46,62, +117,112,192,0,11,35,114,120,34,91,46,93,115,115,36,34,32,60,89,162,44, +37,52,2,25,222,33,61,28,248,22,79,248,22,73,23,195,2,249,22,7,9, +248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248,22, +79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161, +38,36,11,248,2,60,248,22,73,196,249,22,7,249,22,71,248,22,72,199,196, +195,249,22,7,249,22,71,248,22,72,199,196,195,32,62,89,162,8,44,37,55, +2,25,222,33,63,27,249,22,156,14,2,41,23,196,2,28,23,193,2,87,94, +23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249, +22,156,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248, +22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,156,14,2,41,23,196, +2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2, +62,248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,32,64, +89,162,8,44,37,55,2,25,222,33,65,27,249,22,156,14,2,41,23,196,2, +28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22, +105,23,197,1,27,249,22,156,14,2,41,23,196,2,28,23,193,2,87,94,23, +194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22, +156,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, +96,23,196,2,248,2,64,248,22,105,23,197,1,248,22,81,194,248,22,81,194, +248,22,81,194,27,248,2,64,23,195,1,192,28,249,22,178,8,248,22,73,23, +200,2,23,197,1,28,249,22,176,8,248,22,72,23,200,2,23,196,1,251,22, +143,9,2,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,73,248, +22,86,249,22,71,23,206,1,23,202,1,12,12,247,192,20,14,159,80,159,40, +45,38,249,22,71,248,22,176,14,247,22,149,12,23,197,1,20,14,159,80,159, +40,40,38,250,80,159,43,41,38,249,22,27,11,80,159,45,40,38,22,162,4, +23,196,1,249,247,22,137,5,23,198,1,248,22,59,248,22,173,13,23,198,1, +87,94,28,28,248,22,169,13,23,196,2,10,248,22,188,4,23,196,2,12,28, +23,197,2,250,22,145,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,146,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,69,23,196,2,249,22,176,8,248,22,72,23,198,2,2,3,11,248,22,181, +4,248,22,96,196,28,28,248,22,69,23,196,2,249,22,176,8,248,22,72,23, +198,2,66,112,108,97,110,101,116,11,87,94,28,207,12,20,14,159,80,159,37, +52,38,80,158,37,50,90,161,37,36,10,249,22,163,4,21,94,2,26,6,19, +19,112,108,97,110,101,116,47,114,101,115,111,108,118,101,114,46,114,107,116,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,252,212,199,200,201,202,80,158,42,50,87,94,23, +193,1,27,89,162,8,44,37,46,79,115,104,111,119,45,99,111,108,108,101,99, +116,105,111,110,45,101,114,114,223,5,33,49,27,28,248,22,56,23,198,2,27, +250,22,146,2,80,159,43,44,38,249,22,71,23,203,2,247,22,147,14,11,28, +23,193,2,192,87,94,23,193,1,91,159,38,11,90,161,38,36,11,27,248,22, +62,23,202,2,248,2,50,248,2,52,23,195,1,27,251,80,159,47,54,38,2, +17,23,202,1,28,248,22,79,23,199,2,23,199,2,248,22,72,23,199,2,28, +248,22,79,23,199,2,9,248,22,73,23,199,2,249,22,187,13,23,195,1,28, +248,22,79,23,197,1,87,94,23,197,1,6,8,8,109,97,105,110,46,114,107, +116,249,22,129,7,23,199,1,6,4,4,46,114,107,116,28,248,22,170,6,23, +198,2,87,94,23,194,1,27,27,28,23,200,2,28,249,22,176,8,23,202,2, +80,158,43,47,80,158,41,48,27,248,22,182,4,23,202,2,28,248,22,169,13, +23,194,2,91,159,39,11,90,161,39,36,11,248,22,190,13,23,197,1,87,95, +83,160,38,11,80,158,45,47,23,204,2,83,160,38,11,80,158,45,48,192,192, +11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,138,5,28,23,193,2, +192,87,94,23,193,1,247,22,146,14,27,250,22,146,2,80,159,44,44,38,249, +22,71,23,204,2,23,199,2,11,28,23,193,2,192,87,94,23,193,1,91,159, +38,11,90,161,38,36,11,248,2,54,248,2,56,23,203,2,250,22,1,22,187, +13,23,199,1,249,22,85,249,22,2,32,0,89,162,8,44,37,44,9,222,33, +58,23,200,1,248,22,81,27,248,22,173,6,23,202,2,28,249,22,176,3,194, +39,28,249,22,176,6,2,27,249,22,128,7,204,249,22,164,3,198,39,249,22, +129,7,250,22,128,7,205,36,249,22,164,3,199,39,2,28,200,200,28,248,22, +169,13,23,198,2,87,94,23,194,1,28,248,22,128,14,23,198,2,91,159,39, +11,90,161,39,36,11,248,22,190,13,23,201,2,87,95,23,195,1,23,193,1, +28,249,22,156,14,2,59,248,22,174,13,23,197,1,249,80,159,44,53,38,23, +202,2,2,29,23,200,2,248,22,81,6,26,26,32,40,97,32,112,97,116,104, +32,109,117,115,116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22, +176,8,248,22,72,23,200,2,2,26,27,250,22,146,2,80,159,43,44,38,249, +22,71,23,203,2,247,22,147,14,11,28,23,193,2,192,87,94,23,193,1,91, +159,39,11,90,161,38,36,11,27,248,22,96,23,203,2,248,2,60,248,2,62, +23,195,1,90,161,37,38,11,28,248,22,79,248,22,98,23,203,2,28,248,22, +79,23,194,2,249,22,158,14,0,8,35,114,120,34,91,46,93,34,23,196,2, +11,10,27,27,28,23,197,2,249,22,85,28,248,22,79,248,22,98,23,207,2, +21,93,6,5,5,109,122,108,105,98,249,22,1,22,85,249,22,2,32,0,89, +162,8,44,37,44,9,222,33,66,248,22,98,23,210,2,23,197,2,28,248,22, +79,23,196,2,248,22,81,23,197,2,23,195,2,251,80,159,49,54,38,2,17, +23,204,1,248,22,72,23,198,2,248,22,73,23,198,1,249,22,187,13,23,195, +1,28,23,198,1,87,94,23,196,1,27,248,22,173,6,23,199,2,28,249,22, +176,3,194,39,28,249,22,176,6,2,27,249,22,128,7,201,249,22,164,3,198, +39,249,22,129,7,250,22,128,7,202,36,249,22,164,3,199,39,2,28,197,197, +28,248,22,79,23,197,1,87,94,23,197,1,6,8,8,109,97,105,110,46,114, +107,116,28,249,22,158,14,0,8,35,114,120,34,91,46,93,34,23,199,2,27, +248,22,173,6,23,199,2,28,249,22,176,3,194,39,28,249,22,176,6,2,27, +249,22,128,7,201,249,22,164,3,198,39,249,22,129,7,250,22,128,7,202,36, +249,22,164,3,199,39,2,28,197,197,249,22,129,7,23,199,1,6,4,4,46, +114,107,116,28,249,22,176,8,248,22,72,23,200,2,64,102,105,108,101,27,249, +22,130,14,248,22,134,14,248,22,96,23,202,2,27,28,23,202,2,28,249,22, +176,8,23,204,2,80,158,45,47,80,158,43,48,27,248,22,182,4,23,204,2, +28,248,22,169,13,23,194,2,91,159,39,11,90,161,39,36,11,248,22,190,13, +23,197,1,87,95,83,160,38,11,80,158,47,47,23,206,2,83,160,38,11,80, +158,47,48,192,192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,138, +5,28,23,193,2,192,87,94,23,193,1,247,22,146,14,91,159,39,11,90,161, +39,36,11,248,22,190,13,23,197,2,87,95,23,195,1,23,193,1,28,249,22, +156,14,2,59,248,22,174,13,23,197,1,249,80,159,45,53,38,23,198,1,2, +29,195,12,87,94,28,28,248,22,169,13,23,194,2,10,248,22,128,8,23,194, +2,87,94,23,199,1,12,28,23,199,2,250,22,145,9,67,114,101,113,117,105, +114,101,249,22,154,7,6,17,17,98,97,100,32,109,111,100,117,108,101,32,112, +97,116,104,126,97,28,23,198,2,248,22,72,23,199,2,6,0,0,23,202,1, +87,94,23,199,1,250,22,146,9,2,17,249,22,154,7,6,13,13,109,111,100, +117,108,101,32,112,97,116,104,126,97,28,23,198,2,248,22,72,23,199,2,6, +0,0,23,200,2,27,28,248,22,128,8,23,195,2,249,22,133,8,23,196,2, +36,249,22,132,14,248,22,133,14,23,197,2,11,27,28,248,22,128,8,23,196, +2,249,22,133,8,23,197,2,37,248,80,159,42,55,38,23,195,2,91,159,39, +11,90,161,39,36,11,28,248,22,128,8,23,199,2,250,22,7,2,30,249,22, +133,8,23,203,2,38,2,30,248,22,190,13,23,198,2,87,95,23,195,1,23, +193,1,27,28,248,22,128,8,23,200,2,249,22,133,8,23,201,2,39,249,80, +159,47,53,38,23,197,2,5,0,27,28,248,22,128,8,23,201,2,249,22,133, +8,23,202,2,40,248,22,181,4,23,200,2,27,27,250,22,146,2,80,159,51, +43,38,248,22,176,14,247,22,149,12,11,28,23,193,2,192,87,94,23,193,1, +27,247,22,130,2,87,94,250,22,144,2,80,159,52,43,38,248,22,176,14,247, +22,149,12,195,192,87,95,28,23,208,1,27,250,22,146,2,23,197,2,197,11, +28,23,193,1,12,87,95,27,27,28,248,22,17,80,159,51,46,38,80,159,50, +46,38,247,22,19,250,22,25,248,22,23,23,197,2,80,159,53,45,38,23,196, +1,27,248,22,176,14,247,22,149,12,249,22,3,83,158,40,20,100,94,89,162, +8,44,37,55,9,226,12,11,2,3,33,67,23,195,1,23,196,1,248,28,248, +22,17,80,159,50,46,38,32,0,89,162,44,37,42,9,222,33,68,80,159,49, +59,37,89,162,44,36,51,9,227,13,9,8,4,3,33,69,250,22,144,2,23, +197,1,197,10,12,28,28,248,22,128,8,23,202,1,11,28,248,22,170,6,23, +206,2,10,28,248,22,56,23,206,2,10,28,248,22,69,23,206,2,249,22,176, +8,248,22,72,23,208,2,2,26,11,250,22,144,2,80,159,50,44,38,28,248, +22,170,6,23,209,2,249,22,71,23,210,1,27,28,23,212,2,28,249,22,176, +8,23,214,2,80,158,55,47,87,94,23,212,1,80,158,53,48,27,248,22,182, +4,23,214,2,28,248,22,169,13,23,194,2,91,159,39,11,90,161,39,36,11, +248,22,190,13,23,197,1,87,95,83,160,38,11,80,158,57,47,23,23,83,160, +38,11,80,158,57,48,192,192,11,11,28,23,193,2,192,87,94,23,193,1,27, +247,22,138,5,28,23,193,2,192,87,94,23,193,1,247,22,146,14,249,22,71, +23,210,1,247,22,147,14,252,22,130,8,23,208,1,23,207,1,23,205,1,23, +203,1,201,12,193,87,96,83,160,38,11,80,158,36,50,248,80,159,37,58,38, +249,22,27,11,80,159,39,52,38,248,22,161,4,80,159,37,51,38,248,22,137, +5,80,159,37,37,37,248,22,140,13,80,159,37,42,37,83,160,38,11,80,158, +36,50,248,80,159,37,58,38,249,22,27,11,80,159,39,52,38,159,36,20,105, +159,36,16,1,11,16,0,83,158,42,20,103,144,66,35,37,98,111,111,116,29, +11,11,11,11,11,10,38,80,158,36,36,20,105,159,37,16,23,2,1,2,2, +30,2,4,72,112,97,116,104,45,115,116,114,105,110,103,63,10,30,2,4,75, +112,97,116,104,45,97,100,100,45,115,117,102,102,105,120,7,30,2,6,2,7, +4,30,2,6,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,3,2,8,2,9,2,10,2,11,2,12,2,13, +2,14,2,15,2,16,2,17,30,2,18,2,7,4,30,2,4,79,112,97,116, +104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,9,30,2,4,69, +45,102,105,110,100,45,99,111,108,0,30,2,4,76,110,111,114,109,97,108,45, +99,97,115,101,45,112,97,116,104,6,2,19,2,20,30,2,18,74,114,101,112, +97,114,97,109,101,116,101,114,105,122,101,5,16,0,16,0,36,16,0,36,16, +12,2,11,2,12,2,9,2,10,2,13,2,14,2,2,2,8,2,1,2,16, +2,15,2,17,48,11,11,39,36,11,11,11,16,2,2,19,2,20,16,2,11, +11,16,2,2,19,2,20,38,38,37,11,11,11,16,0,16,0,16,0,36,36, +11,11,11,11,16,0,16,0,16,0,36,36,16,0,16,15,83,158,36,16,2, +89,162,44,37,45,9,223,0,33,31,80,159,36,59,37,83,158,36,16,2,248, +22,189,7,69,115,111,45,115,117,102,102,105,120,80,159,36,36,37,83,158,36, +16,2,89,162,44,38,8,35,2,2,223,0,33,40,80,159,36,37,37,83,158, +36,16,2,32,0,89,162,8,44,37,42,2,8,222,192,80,159,36,42,37,83, +158,36,16,2,247,22,133,2,80,159,36,43,37,83,158,36,16,2,247,22,132, +2,80,159,36,44,37,83,158,36,16,2,247,22,67,80,159,36,45,37,83,158, +36,16,2,248,22,18,74,109,111,100,117,108,101,45,108,111,97,100,105,110,103, +80,159,36,46,37,83,158,36,16,2,11,80,158,36,47,83,158,36,16,2,11, +80,158,36,48,83,158,36,16,2,32,0,89,162,44,38,8,25,2,15,222,33, +46,80,159,36,49,37,83,158,36,16,2,11,80,158,36,50,83,158,36,16,2, +91,159,38,10,90,161,37,36,10,11,90,161,37,37,10,83,158,39,20,99,96, +2,17,89,162,8,44,37,51,9,224,2,0,33,47,89,162,44,39,49,9,223, +1,33,48,89,162,44,40,8,32,9,224,2,0,33,70,208,80,159,36,51,37, +83,158,36,16,2,89,162,44,36,45,2,19,223,0,33,71,80,159,36,56,37, +83,158,36,16,2,89,162,8,44,36,45,2,20,223,0,33,72,80,159,36,57, +37,96,29,94,2,3,68,35,37,107,101,114,110,101,108,11,29,94,2,3,69, +35,37,109,105,110,45,115,116,120,11,2,4,2,18,9,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 6528); } diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h index abdea6a6b0..c2e16f9abb 100644 --- a/src/mzscheme/src/schvers.h +++ b/src/mzscheme/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "4.2.5.7" +#define MZSCHEME_VERSION "4.2.5.8" #define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Z 5 -#define MZSCHEME_VERSION_W 7 +#define MZSCHEME_VERSION_W 8 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) diff --git a/src/mzscheme/src/startup.inc b/src/mzscheme/src/startup.inc index 4afb183f46..21d7ae84cb 100644 --- a/src/mzscheme/src/startup.inc +++ b/src/mzscheme/src/startup.inc @@ -411,12 +411,14 @@ " s" "(let((d(current-load-relative-directory)))" "(if d(path->complete-path s d) s)))))" +"(date-of-1(lambda(a)" +"(let((v(file-or-directory-modify-seconds a #f(lambda() #f))))" +"(and v(cons a v)))))" "(date-of(lambda(a modes)" "(ormap" "(lambda(compiled-dir)" "(let((a(a compiled-dir)))" -"(let((v(file-or-directory-modify-seconds a #f(lambda() #f))))" -"(and v(cons a v)))))" +"(date-of-1 a)))" " modes)))" "(date>=?" "(lambda(modes a bm)" @@ -427,11 +429,34 @@ "(lambda(path expect-module)" "(unless(path-string? path)" " (raise-type-error 'load/use-compiled \"path or valid-path string\" path))" -"(let*-values(((path)(resolve path))" -"((base file dir?)(split-path path))" +"(let*-values(((orig-path)(resolve path))" +"((base orig-file dir?)(split-path path))" +"((file alt-file)(if expect-module" +"(let*((b(path->bytes orig-file))" +"(len(bytes-length b)))" +"(cond" +"((and(len . >= . 4)" +" (bytes=? #\".rkt\" (subbytes b (- len 4))))" +"(values orig-file" +" (bytes->path (bytes-append (subbytes b 0 (- len 4)) #\".ss\"))))" +"(else" +"(values orig-file #f))))" +"(values orig-file #f)))" +"((path)(if(eq? file orig-file)" +" orig-path" +"(build-path base file)))" +"((alt-path)(and alt-file" +"(if(eq? alt-file orig-file)" +" orig-path" +"(build-path base alt-file))))" "((base)(if(eq? base 'relative) 'same base))" "((modes)(use-compiled-file-paths)))" -"(let*((get-so(lambda(file rep-sfx?)" +"(let*((main-path-d(date-of-1 path))" +"(alt-path-d(and alt-path " +"(not main-path-d)" +"(date-of-1 alt-path)))" +"(path-d(or main-path-d alt-path-d))" +"(get-so(lambda(file rep-sfx?)" "(lambda(compiled-dir)" "(build-path base" " compiled-dir" @@ -446,23 +471,37 @@ "(build-path base" " compiled-dir" " (path-add-suffix file #\".zo\"))))" +"(alt-zo(lambda(compiled-dir)" +"(build-path base" +" compiled-dir" +" (path-add-suffix alt-file #\".zo\"))))" "(so(get-so file #t))" -"(path-d(date-of(lambda(dir) path) modes))" +"(alt-so(get-so alt-file #t))" "(with-dir(lambda(t) " "(parameterize((current-load-relative-directory " "(if(path? base) " " base " "(current-directory))))" -"(t)))))" +"(t))))" +"(try-main?(or main-path-d(not alt-path-d)))" +"(try-alt?(or alt-path-d(not main-path-d))))" "(cond" -"((date>=? modes so path-d)" +"((or(and try-main?" +"(date>=? modes so path-d))" +"(and try-alt?" +"(date>=? modes alt-so alt-path-d)))" " =>(lambda(so-d)" "(with-dir(lambda()((current-load-extension)(car so-d) expect-module)))))" -"((date>=? modes zo path-d)" +"((or(and try-main?" +"(date>=? modes zo path-d))" +"(and try-alt?" +"(date>=? modes alt-zo path-d)))" " =>(lambda(zo-d)" "(with-dir(lambda()((current-load)(car zo-d) expect-module)))))" "(else" -"(with-dir(lambda()((current-load) path expect-module))))))))))" +"(with-dir(lambda()((current-load) " +"(if try-main? path alt-path)" +" expect-module))))))))))" "(define-values(default-reader-guard)" "(lambda(path) path))" "(define-values(-module-hash-table-table)(make-weak-hasheq)) " @@ -527,7 +566,7 @@ "(with-continuation-mark" " parameterization-key" " orig-paramz" -" (set! planet-resolver (dynamic-require '(lib \"planet/resolver.ss\") 'planet-module-name-resolver))))" +" (set! planet-resolver (dynamic-require '(lib \"planet/resolver.rkt\") 'planet-module-name-resolver))))" "(planet-resolver s relto stx load? orig-paramz))" "(else" "(let((get-dir(lambda()" @@ -548,7 +587,18 @@ " #f" " s" " stx)" -"(error s)))))" +"(error s))))" +"(ss->rkt(lambda(s)" +"(let((len(string-length s)))" +"(if(and(len . >= . 3)" +" (string=? \".ss\" (substring s (- len 3))))" +" (string-append (substring s 0 (- len 3)) \".rkt\")" +" s))))" +"(path-ss->rkt(lambda(p)" +"(let-values(((base name dir?)(split-path p)))" +" (if (regexp-match #rx\"[.]ss$\" (path->bytes name))" +" (path-replace-suffix p #\".rkt\")" +" p)))))" "(let((s-parsed" "(cond" "((symbol? s)" @@ -561,8 +611,8 @@ "(if(null? cols) file(car cols))" "(if(null? cols) null(cdr cols)))))" "(build-path p(if(null? cols)" -" \"main.ss\"" -" (string-append file \".ss\")))))))" +" \"main.rkt\"" +" (string-append file \".rkt\")))))))" "((string? s)" "(let*((dir(get-dir)))" "(or(hash-ref -path-cache(cons s dir) #f)" @@ -576,10 +626,10 @@ " ((string=? s \"..\") 'up)" "(else s)))" " cols)" -"(list file)))))))" +"(list(ss->rkt file))))))))" "((path? s) " "(if(absolute-path? s)" -" s" +"(path-ss->rkt s)" " (list \" (a path must be absolute)\")))" "((eq?(car s) 'lib)" "(or(hash-ref -path-cache" @@ -607,14 +657,14 @@ "(car cols)" "(cdr cols)))))" "(build-path p(if old-style?" -" file" +"(ss->rkt file)" "(if(null? cols)" -" \"main.ss\"" +" \"main.rkt\"" " (if (regexp-match? #rx\"[.]\" file)" -" file" -" (string-append file \".ss\")))))))))" +"(ss->rkt file)" +" (string-append file \".rkt\")))))))))" "((eq?(car s) 'file)" -"(path->complete-path(expand-user-path(cadr s))(get-dir))))))" +"(path-ss->rkt(path->complete-path(expand-user-path(cadr s))(get-dir)))))))" "(unless(or(path? s-parsed) " "(vector? s-parsed))" "(if stx" diff --git a/src/mzscheme/src/startup.ss b/src/mzscheme/src/startup.ss index 681c0aff3c..df73dd76e4 100644 --- a/src/mzscheme/src/startup.ss +++ b/src/mzscheme/src/startup.ss @@ -490,12 +490,14 @@ s (let ([d (current-load-relative-directory)]) (if d (path->complete-path s d) s))))] + [date-of-1 (lambda (a) + (let ([v (file-or-directory-modify-seconds a #f (lambda () #f))]) + (and v (cons a v))))] [date-of (lambda (a modes) (ormap (lambda (compiled-dir) (let ([a (a compiled-dir)]) - (let ([v (file-or-directory-modify-seconds a #f (lambda () #f))]) - (and v (cons a v))))) + (date-of-1 a))) modes))] [date>=? (lambda (modes a bm) @@ -506,11 +508,36 @@ (lambda (path expect-module) (unless (path-string? path) (raise-type-error 'load/use-compiled "path or valid-path string" path)) - (let*-values ([(path) (resolve path)] - [(base file dir?) (split-path path)] + (let*-values ([(orig-path) (resolve path)] + [(base orig-file dir?) (split-path path)] + [(file alt-file) (if expect-module + (let* ([b (path->bytes orig-file)] + [len (bytes-length b)]) + (cond + [(and (len . >= . 4) + (bytes=? #".rkt" (subbytes b (- len 4)))) + ;; .rkt => try .rkt then .ss + (values orig-file + (bytes->path (bytes-append (subbytes b 0 (- len 4)) #".ss")))] + [else + ;; No search path + (values orig-file #f)])) + (values orig-file #f))] + [(path) (if (eq? file orig-file) + orig-path + (build-path base file))] + [(alt-path) (and alt-file + (if (eq? alt-file orig-file) + orig-path + (build-path base alt-file)))] [(base) (if (eq? base 'relative) 'same base)] [(modes) (use-compiled-file-paths)]) - (let* ([get-so (lambda (file rep-sfx?) + (let* ([main-path-d (date-of-1 path)] + [alt-path-d (and alt-path + (not main-path-d) + (date-of-1 alt-path))] + [path-d (or main-path-d alt-path-d)] + [get-so (lambda (file rep-sfx?) (lambda (compiled-dir) (build-path base compiled-dir @@ -525,23 +552,37 @@ (build-path base compiled-dir (path-add-suffix file #".zo")))] + [alt-zo (lambda (compiled-dir) + (build-path base + compiled-dir + (path-add-suffix alt-file #".zo")))] [so (get-so file #t)] - [path-d (date-of (lambda (dir) path) modes)] + [alt-so (get-so alt-file #t)] [with-dir (lambda (t) (parameterize ([current-load-relative-directory (if (path? base) base (current-directory))]) - (t)))]) + (t)))] + [try-main? (or main-path-d (not alt-path-d))] + [try-alt? (or alt-path-d (not main-path-d))]) (cond - [(date>=? modes so path-d) + [(or (and try-main? + (date>=? modes so path-d)) + (and try-alt? + (date>=? modes alt-so alt-path-d))) => (lambda (so-d) (with-dir (lambda () ((current-load-extension) (car so-d) expect-module))))] - [(date>=? modes zo path-d) + [(or (and try-main? + (date>=? modes zo path-d)) + (and try-alt? + (date>=? modes alt-zo path-d))) => (lambda (zo-d) (with-dir (lambda () ((current-load) (car zo-d) expect-module))))] [else - (with-dir (lambda () ((current-load) path expect-module)))])))))) + (with-dir (lambda () ((current-load) + (if try-main? path alt-path) + expect-module)))])))))) (define-values (default-reader-guard) (lambda (path) path)) @@ -616,7 +657,7 @@ (with-continuation-mark parameterization-key orig-paramz - (set! planet-resolver (dynamic-require '(lib "planet/resolver.ss") 'planet-module-name-resolver)))) + (set! planet-resolver (dynamic-require '(lib "planet/resolver.rkt") 'planet-module-name-resolver)))) (planet-resolver s relto stx load? orig-paramz)] [else (let ([get-dir (lambda () @@ -637,7 +678,18 @@ #f s stx) - (error s)))]) + (error s)))] + [ss->rkt (lambda (s) + (let ([len (string-length s)]) + (if (and (len . >= . 3) + (string=? ".ss" (substring s (- len 3)))) + (string-append (substring s 0 (- len 3)) ".rkt") + s)))] + [path-ss->rkt (lambda (p) + (let-values ([(base name dir?) (split-path p)]) + (if (regexp-match #rx"[.]ss$" (path->bytes name)) + (path-replace-suffix p #".rkt") + p)))]) (let ([s-parsed ;; Non-string result represents an error (cond @@ -651,8 +703,8 @@ (if (null? cols) file (car cols)) (if (null? cols) null (cdr cols)))]) (build-path p (if (null? cols) - "main.ss" - (string-append file ".ss"))))))] + "main.rkt" + (string-append file ".rkt"))))))] [(string? s) (let* ([dir (get-dir)]) (or (hash-ref -path-cache (cons s dir) #f) @@ -666,10 +718,10 @@ [(string=? s "..") 'up] [else s])) cols) - (list file))))))] + (list (ss->rkt file)))))))] [(path? s) (if (absolute-path? s) - s + (path-ss->rkt s) (list " (a path must be absolute)"))] [(eq? (car s) 'lib) (or (hash-ref -path-cache @@ -697,14 +749,14 @@ (car cols) (cdr cols)))]) (build-path p (if old-style? - file + (ss->rkt file) (if (null? cols) - "main.ss" + "main.rkt" (if (regexp-match? #rx"[.]" file) - file - (string-append file ".ss"))))))))] + (ss->rkt file) + (string-append file ".rkt"))))))))] [(eq? (car s) 'file) - (path->complete-path (expand-user-path (cadr s)) (get-dir))])]) + (path-ss->rkt (path->complete-path (expand-user-path (cadr s)) (get-dir)))])]) (unless (or (path? s-parsed) (vector? s-parsed)) (if stx