From ae89e210fbe04490e52a10f22b14b2e48dafd803 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 22 Mar 2012 18:43:11 -0600 Subject: [PATCH] allow `(submod "..")' as a shorthand for `(submod "." "..")' Also, `(submod ".")' is allowed as a module path; it's not useful, but it makes the grammar slightly more regular. --- collects/scribblings/guide/module-paths.scrbl | 16 +- collects/scribblings/reference/syntax.scrbl | 17 +- collects/syntax/modresolve.rkt | 20 +- collects/syntax/private/modcollapse-noctc.rkt | 18 +- collects/tests/racket/moddep.rktl | 16 +- collects/tests/racket/module.rktl | 3 + collects/tests/racket/submodule.rktl | 38 ++ src/racket/src/cstartup.inc | 376 +++++++++--------- src/racket/src/module.c | 37 +- src/racket/src/schvers.h | 4 +- src/racket/src/startup.inc | 34 +- src/racket/src/startup.rktl | 36 +- 12 files changed, 360 insertions(+), 255 deletions(-) diff --git a/collects/scribblings/guide/module-paths.scrbl b/collects/scribblings/guide/module-paths.scrbl index 92e0d6fcbf..09de4a1337 100644 --- a/collects/scribblings/guide/module-paths.scrbl +++ b/collects/scribblings/guide/module-paths.scrbl @@ -212,7 +212,8 @@ with other forms.} @specsubform/subs[#:literals (submod) (submod base element ...+) ([base module-path - "."] + "." + ".."] [element id ".."])]{ @@ -229,13 +230,14 @@ names to reach the final submodule. monkey ] -Using @racket["."] as @racket[base] within @racket[submod] stands for the -enclosing module. When a path of the form @racket[(#,(racket quote) -id)] refers to a submodule, it is equivalent to @racket[(submod "." -id)]. +Using @racket["."] as @racket[base] within @racket[submod] stands for +the enclosing module. Using @racket[".."] as @racket[base] is +equivalent to using @racket["."] followed by an extra +@racket[".."]. When a path of the form @racket[(#,(racket quote) id)] +refers to a submodule, it is equivalent to @racket[(submod "." id)]. Using @racket[".."] as an @racket[element] cancels one submodule step, effectively -referring to the enclosing module. For example, @racket[(submod "." "..")] +referring to the enclosing module. For example, @racket[(submod "..")] refers to the enclosing module of the submodule in which the path appears. @@ -245,7 +247,7 @@ appears. (provide monkey) (define monkey "Curious George")) (module crocodile-house racket - (require (submod "." ".." monkey-house)) + (require (submod ".." monkey-house)) (provide dinner) (define dinner monkey))) (require (submod 'zoo crocodile-house)) diff --git a/collects/scribblings/reference/syntax.scrbl b/collects/scribblings/reference/syntax.scrbl index 945a26708d..7c33159f27 100644 --- a/collects/scribblings/reference/syntax.scrbl +++ b/collects/scribblings/reference/syntax.scrbl @@ -362,8 +362,9 @@ Legal only in a @tech{module begin context}, and handled by the (for-label require-spec ...) (for-meta phase-level require-spec ...) derived-require-spec] - [module-path (submod root-module-path submod-path-element ...+) - (submod "." submod-path-element ...+)] + [module-path (submod root-module-path submod-path-element ...) + (submod "." submod-path-element ...) + (submod ".." submod-path-element ...)] [root-module-path (#,(racket quote) id) rel-string (lib rel-string ...+) @@ -765,14 +766,18 @@ corresponds to the default @tech{module name resolver}. (eval:alts (require (planet mcdonald/farm:2:5/duck)) (void)) ]} - @defsubform*[((submod root-module submod-path-element ...+) - (submod "." submod-path-element ...+))]{ + @defsubform*[((submod root-module submod-path-element ...) + (submod "." submod-path-element ...) + (submod ".." submod-path-element ...))]{ Identifies a @tech{submodule} within the module specified by @racket[root-module] - or relative to the current module in the case of @racket[(submod "." ....)]. + or relative to the current module in the case of @racket[(submod "." ....)], + where @racket[(submod ".." submod-path-element ...)] is equivalent to + @racket[(submod "." ".." submod-path-element ...)]. Submodules have symbolic names, and a sequence of identifiers as @racket[submod-path-element]s determine a path of successively nested submodules with the given names. A @racket[".."] as a @racket[submod-path-element] names the enclosing module - of a submodule, and it's intended for use in @racket[(submod "." ....)] forms.} + of a submodule, and it's intended for use in @racket[(submod "." ....)] + and @racket[(submod ".." ....)] forms.} } diff --git a/collects/syntax/modresolve.rkt b/collects/syntax/modresolve.rkt index 9bb3313bad..8e332645e1 100644 --- a/collects/syntax/modresolve.rkt +++ b/collects/syntax/modresolve.rkt @@ -96,14 +96,20 @@ (module-path-index-join s #f))) submod)] [(eq? (car s) 'submod) - (define r (if (equal? (cadr s) ".") - (let () - (define-values (d submod) (force-relto relto #f)) - (combine-submod d submod)) - (resolve-module-path (cadr s) relto))) - (define base-submods (if (and (equal? (cadr s) ".") (pair? r)) (cddr r) null)) + (define r (cond + [(or (equal? (cadr s) ".") + (equal? (cadr s) "..")) + (define-values (d submod) (force-relto relto #f)) + (combine-submod d submod)] + [else (resolve-module-path (cadr s) relto)])) + (define base-submods (if (and (or (equal? (cadr s) ".") + (equal? (cadr s) "..")) + (pair? r)) + (cddr r) + null)) (define base (if (pair? r) (cadr r) r)) - (flatten base (append base-submods (cddr s)))] + (flatten base (append base-submods + (if (equal? (cadr s) "..") (cdr s) (cddr s))))] [else #f])) (define (resolve-module-path-index mpi relto) diff --git a/collects/syntax/private/modcollapse-noctc.rkt b/collects/syntax/private/modcollapse-noctc.rkt index 022746c55a..f4c76eb608 100644 --- a/collects/syntax/private/modcollapse-noctc.rkt +++ b/collects/syntax/private/modcollapse-noctc.rkt @@ -287,7 +287,9 @@ Use syntax/modcollapse instead. (if (null? subpath) (cadr sm) `(submod ,(cadr sm) ,@subpath))) - sm)) + (if (null? (cddr sm)) + (cadr sm) + sm))) (let normalize-recur ([s s]) (cond [(string? s) @@ -317,11 +319,15 @@ Use syntax/modcollapse instead. [(eq? (car s) 'planet) (normalize-planet s)] [(eq? (car s) 'quote) s] [(eq? (car s) 'submod) - (if (equal? (cadr s) ".") - (begin - (flatten-relto-mp!) - (normalize-submod `(submod ,relto-mp ,@relto-submod ,@(cddr s)))) - (normalize-submod `(submod ,(normalize-recur (cadr s)) ,@relto-submod ,@(cddr s))))] + (cond + [(equal? (cadr s) ".") + (flatten-relto-mp!) + (normalize-submod `(submod ,relto-mp ,@relto-submod ,@(cddr s)))] + [(equal? (cadr s) "..") + (flatten-relto-mp!) + (normalize-submod `(submod ,relto-mp ,@relto-submod ,@(cdr s)))] + [else + (normalize-submod `(submod ,(normalize-recur (cadr s)) ,@relto-submod ,@(cddr s)))])] [else #f]))) (define (collapse-module-path-index mpi relto-mp) diff --git a/collects/tests/racket/moddep.rktl b/collects/tests/racket/moddep.rktl index 545722e6a6..968f786fb0 100644 --- a/collects/tests/racket/moddep.rktl +++ b/collects/tests/racket/moddep.rktl @@ -14,6 +14,7 @@ (unless (and (pair? path) (eq? 'submod (car path))) (test `(submod ,expect a b) resolve-module-path `(submod ,path a b) rel-to) (test `(submod ,expect a b) resolve-module-path `(submod ,path a c ".." b) rel-to) + (test expect resolve-module-path `(submod ,path) rel-to) (when rel-to (test expect collapse-module-path path (if (procedure? rel-to) (lambda () `(submod ,(rel-to) a b)) @@ -29,7 +30,8 @@ pi-rel-to) (unless (and (pair? path) (eq? (car path) 'submod) - (equal? (cadr path) ".")) + (or (equal? (cadr path) ".") + (equal? (cadr path) ".."))) (test expect resolve-module-path-index (module-path-index-join path (module-path-index-join @@ -67,8 +69,10 @@ (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) (test-rmp `(submod ,(build-path mzlib "y.rkt") n) '(submod "y.rkt" n) `(submod ,(build-path mzlib "x.rkt") q z)) + (test-rmp `(submod ,(build-path mzlib "x.rkt") q) '(submod "..") `(submod ,(build-path mzlib "x.rkt") q z)) (test-rmp `(submod ,(build-path mzlib "x.rkt") q) '(submod "." "..") `(submod ,(build-path mzlib "x.rkt") q z)) (test-rmp (build-path mzlib "x.rkt") '(submod "." ".." "..") `(submod ,(build-path mzlib "x.rkt") q z)) + (test-rmp (build-path mzlib "x.rkt") '(submod ".." "..") `(submod ,(build-path mzlib "x.rkt") q z)) (void)) (err/rt-test (resolve-module-path "apple.ss" 'no)) @@ -90,6 +94,7 @@ (unless (and (pair? path) (eq? 'submod (car path))) (test `(submod ,expect a b) collapse-module-path `(submod ,path a b) rel-to) (test `(submod ,expect a b) collapse-module-path `(submod ,path a c ".." b) rel-to) + (test expect collapse-module-path `(submod ,path) rel-to) (unless (symbol? rel-to) (test expect collapse-module-path path (if (procedure? rel-to) (lambda () `(submod ,(rel-to) a b)) @@ -97,7 +102,10 @@ (test expect collapse-module-path-index (module-path-index-join path (module-path-index-join #f #f)) rel-to) - (unless (and (pair? path) (eq? 'submod (car path)) (equal? (cadr path) ".")) + (unless (and (pair? path) + (eq? 'submod (car path)) + (or (equal? (cadr path) ".") + (equal? (cadr path) ".."))) (test expect collapse-module-path-index (module-path-index-join path (module-path-index-join @@ -258,9 +266,13 @@ (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-cmp ''a '(submod ".") ''a) (test-cmp '(submod 'a x y) '(submod "." x y) ''a) (test-cmp '(submod 'a q z x y) '(submod "." x y) '(submod 'a q z)) (test-cmp '(submod 'a q y) '(submod "." ".." y) '(submod 'a q z)) +(test-cmp '(submod 'a q y) '(submod ".." y) '(submod 'a q z)) +(test-cmp '(submod 'a q) '(submod "..") '(submod 'a q z)) +(test-cmp '(submod 'a q y) '(submod ".." y) '(submod 'a q z)) (test-cmp ''a '(submod "." ".." "..") '(submod 'a q z)) (test-cmp `(submod ,(build-path 'same) x y) '(submod "." x y) (build-path 'same)) diff --git a/collects/tests/racket/module.rktl b/collects/tests/racket/module.rktl index 41a2ca9f2a..ab079a5cd9 100644 --- a/collects/tests/racket/module.rktl +++ b/collects/tests/racket/module.rktl @@ -389,6 +389,9 @@ (test #t module-path? "x/.") (test #t module-path? "x/..") +(test #t module-path? (collection-file-path "module.rktl" "tests" "racket")) +(test #t module-path? (string->path "x")) + (test #t module-path? 'hello) (test #f module-path? 'hello/) (test #f module-path? 'hello.rkt) diff --git a/collects/tests/racket/submodule.rktl b/collects/tests/racket/submodule.rktl index 92c77135ed..b8694b943f 100644 --- a/collects/tests/racket/submodule.rktl +++ b/collects/tests/racket/submodule.rktl @@ -5,6 +5,44 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(test #t module-path? '(submod ".")) +(test #t module-path? '(submod "." x)) +(test #t module-path? '(submod "." x y)) +(test #t module-path? '(submod "." x ".." y)) +(test #t module-path? '(submod "." x ".." y ".." ".." "..")) +(test #f module-path? '(submod "." "x" y)) +(test #f module-path? '(submod "." x "y")) +(test #t module-path? '(submod "..")) +(test #t module-path? '(submod ".." x)) +(test #t module-path? '(submod ".." x y)) +(test #f module-path? '(submod ".." "x" y)) +(test #f module-path? '(submod ".." x "y")) +(test #t module-path? '(submod ".." "..")) +(test #f module-path? '(submod ".." ".")) + +(test #t module-path? '(submod x a b)) +(test #f module-path? '(submod x "a" b)) + +(test #t module-path? '(submod 'x a)) +(test #t module-path? '(submod 'x)) + +(define (check-resolution root [root-mod root]) + (test root resolved-module-path-name + (module-path-index-resolve (module-path-index-join `(submod ,root-mod) #f))) + (test root resolved-module-path-name + (module-path-index-resolve (module-path-index-join `(submod ".") (make-resolved-module-path root)))) + (test root resolved-module-path-name + (module-path-index-resolve (module-path-index-join `(submod "." "..") (make-resolved-module-path (list root 'y))))) + (test root resolved-module-path-name + (module-path-index-resolve (module-path-index-join `(submod "..") (make-resolved-module-path (list root 'y))))) + (err/rt-test + (module-path-index-resolve (module-path-index-join `(submod "..") (make-resolved-module-path root))) + exn:fail?)) +(check-resolution 'x ''x) +(check-resolution (path->complete-path "file.rkt")) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (module subm-example-1 racket/base (define x 1) (provide x) diff --git a/src/racket/src/cstartup.inc b/src/racket/src/cstartup.inc index 3d0bde5430..da89164fb0 100644 --- a/src/racket/src/cstartup.inc +++ b/src/racket/src/cstartup.inc @@ -1,5 +1,5 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,49,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,50,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,51,0,0,0,1,0,0,10,0, 13,0,20,0,33,0,38,0,42,0,45,0,50,0,57,0,61,0,66,0,73, 0,82,0,85,0,91,0,105,0,119,0,122,0,128,0,132,0,134,0,145,0, @@ -16,12 +16,12 @@ 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, -160,77,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36,16, +237,81,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36,16, 20,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,2, 2,8,2,2,2,9,2,2,2,10,2,2,2,11,2,2,2,12,2,2,97, -37,11,8,240,160,77,0,0,93,159,2,16,36,37,16,2,2,13,161,2,2, -37,2,13,2,2,2,13,96,38,11,8,240,160,77,0,0,16,0,96,11,11, -8,240,160,77,0,0,16,0,18,98,64,104,101,114,101,13,16,5,36,2,14, +37,11,8,240,237,81,0,0,93,159,2,16,36,37,16,2,2,13,161,2,2, +37,2,13,2,2,2,13,96,38,11,8,240,237,81,0,0,16,0,96,11,11, +8,240,237,81,0,0,16,0,18,98,64,104,101,114,101,13,16,5,36,2,14, 2,2,11,11,8,32,8,31,8,30,8,29,27,248,22,156,4,195,249,22,149, 4,80,158,39,36,251,22,83,2,18,248,22,98,199,12,249,22,73,2,19,248, 22,100,201,27,248,22,156,4,195,249,22,149,4,80,158,39,36,251,22,83,2, @@ -30,14 +30,14 @@ 194,248,22,74,193,249,22,149,4,80,158,39,36,251,22,83,2,18,248,22,74, 199,249,22,73,2,6,248,22,75,201,11,18,100,10,13,16,5,36,2,14,2, 2,11,11,8,32,8,31,8,30,8,29,16,4,11,11,2,20,3,1,8,101, -110,118,49,53,50,52,48,16,4,11,11,2,21,3,1,8,101,110,118,49,53, -50,52,49,27,248,22,75,248,22,156,4,196,28,248,22,81,193,20,14,159,37, +110,118,49,53,53,52,49,16,4,11,11,2,21,3,1,8,101,110,118,49,53, +53,52,50,27,248,22,75,248,22,156,4,196,28,248,22,81,193,20,14,159,37, 36,37,28,248,22,81,248,22,75,194,248,22,74,193,249,22,149,4,80,158,39, 36,250,22,83,2,22,248,22,83,249,22,83,248,22,83,2,23,248,22,74,201, 251,22,83,2,18,2,23,2,23,249,22,73,2,7,248,22,75,204,18,100,11, 13,16,5,36,2,14,2,2,11,11,8,32,8,31,8,30,8,29,16,4,11, -11,2,20,3,1,8,101,110,118,49,53,50,52,51,16,4,11,11,2,21,3, -1,8,101,110,118,49,53,50,52,52,248,22,156,4,193,27,248,22,156,4,194, +11,2,20,3,1,8,101,110,118,49,53,53,52,52,16,4,11,11,2,21,3, +1,8,101,110,118,49,53,53,52,53,248,22,156,4,193,27,248,22,156,4,194, 249,22,73,248,22,83,248,22,74,196,248,22,75,195,27,248,22,75,248,22,156, 4,23,197,1,249,22,149,4,80,158,39,36,28,248,22,58,248,22,150,4,248, 22,74,23,198,2,27,249,22,2,32,0,88,163,8,36,37,43,11,9,222,33, @@ -67,8 +67,8 @@ 28,249,22,142,9,248,22,150,4,248,22,74,200,64,101,108,115,101,10,248,22, 74,197,250,22,84,2,22,9,248,22,75,200,249,22,73,2,11,248,22,75,202, 99,13,16,5,36,2,14,2,2,11,11,8,32,8,31,8,30,8,29,16,4, -11,11,2,20,3,1,8,101,110,118,49,53,50,54,54,16,4,11,11,2,21, -3,1,8,101,110,118,49,53,50,54,55,18,158,94,10,64,118,111,105,100,8, +11,11,2,20,3,1,8,101,110,118,49,53,53,54,55,16,4,11,11,2,21, +3,1,8,101,110,118,49,53,53,54,56,18,158,94,10,64,118,111,105,100,8, 48,27,248,22,75,248,22,156,4,196,249,22,149,4,80,158,39,36,28,248,22, 58,248,22,150,4,248,22,74,197,250,22,83,2,28,248,22,83,248,22,74,199, 248,22,98,198,27,248,22,150,4,248,22,74,197,250,22,83,2,28,248,22,83, @@ -99,7 +99,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 2024); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,49,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,50,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,109,0,0,0,1,0,0,8,0, 21,0,26,0,43,0,65,0,94,0,109,0,127,0,139,0,155,0,169,0,191, 0,207,0,224,0,246,0,1,1,7,1,16,1,23,1,30,1,42,1,58,1, @@ -599,7 +599,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 10435); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,49,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,50,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,1,0,0,15,0, 40,0,57,0,75,0,97,0,120,0,140,0,162,0,169,0,176,0,183,0,0, 0,178,1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,1, @@ -626,7 +626,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 502); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,49,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,50,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,1,0,0,7,0, 18,0,45,0,51,0,64,0,73,0,80,0,102,0,124,0,150,0,158,0,170, 0,185,0,201,0,219,0,239,0,251,0,11,1,34,1,46,1,77,1,84,1, @@ -634,8 +634,8 @@ 1,163,1,170,1,174,1,185,1,192,1,195,1,203,1,212,1,220,1,21,2, 124,2,145,2,166,2,196,2,226,2,28,3,86,3,135,3,184,3,32,10,83, 10,146,10,165,10,179,10,81,11,94,11,228,11,14,13,137,13,143,13,171,13, -184,13,81,14,88,14,142,14,164,14,184,14,239,14,249,14,80,15,82,15,185, -15,202,23,255,23,23,24,47,24,0,0,177,27,0,0,66,35,37,98,111,111, +184,13,90,14,97,14,151,14,173,14,193,14,248,14,2,15,89,15,91,15,194, +15,38,24,91,24,115,24,139,24,0,0,13,28,0,0,66,35,37,98,111,111, 116,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,4,67,35,37,117,116,105,108,115,11,68,35,37,112,97, @@ -807,177 +807,181 @@ 249,22,144,9,248,22,74,23,199,2,2,32,28,248,22,81,23,196,2,86,95, 23,196,1,23,195,1,250,22,175,9,2,21,6,37,37,116,111,111,32,109,97, 110,121,32,34,46,46,34,115,32,105,110,32,115,117,98,109,111,100,117,108,101, -32,112,97,116,104,58,32,126,46,115,250,22,84,2,31,28,249,22,144,9,200, -2,33,198,249,22,83,28,248,22,58,201,2,4,2,34,200,199,251,2,65,196, -197,248,22,75,199,248,22,75,200,251,2,65,196,197,249,22,73,248,22,74,202, -200,248,22,75,200,251,2,65,196,197,9,197,27,249,22,155,7,6,31,31,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,58,32,196,28,193,250,22,177,9,11,195,196,248,22, -175,9,193,28,249,22,138,7,194,2,33,2,27,28,249,22,138,7,194,2,32, -62,117,112,192,32,70,88,163,8,36,37,50,11,67,115,115,45,62,114,107,116, -222,33,71,27,248,22,135,7,194,28,249,22,188,3,194,39,28,249,22,138,7, -6,3,3,46,115,115,249,22,154,7,197,249,22,176,3,198,39,249,22,155,7, -250,22,154,7,198,36,249,22,176,3,199,39,2,38,193,193,0,8,35,114,120, -34,91,46,93,34,28,249,22,144,9,248,22,75,23,200,2,23,197,1,28,249, -22,142,9,248,22,74,23,200,2,23,196,1,251,22,175,9,2,21,6,28,28, -99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,32,97,116,32,126, -46,115,58,32,126,46,115,23,200,1,249,22,2,22,75,248,22,88,249,22,73, -23,206,1,23,202,1,12,12,247,192,20,13,159,80,159,43,48,38,249,22,73, -249,22,73,248,22,172,15,247,22,137,13,23,201,1,23,195,1,20,13,159,80, -159,43,40,37,250,80,159,46,41,37,249,22,27,11,80,159,48,40,37,22,181, -4,23,198,2,249,247,22,163,5,23,200,1,27,248,22,61,248,22,163,14,23, -201,1,28,23,202,2,28,250,22,153,2,23,200,1,23,201,1,11,249,22,73, -11,203,249,22,73,194,203,192,86,94,28,28,248,22,159,14,23,197,2,10,248, -22,148,5,23,197,2,12,28,23,198,2,250,22,177,9,11,6,15,15,98,97, -100,32,109,111,100,117,108,101,32,112,97,116,104,23,201,2,250,22,178,9,2, -21,6,19,19,109,111,100,117,108,101,45,112,97,116,104,32,111,114,32,112,97, -116,104,23,199,2,28,28,248,22,71,23,197,2,249,22,142,9,248,22,74,23, -199,2,2,4,11,248,22,139,5,248,22,98,197,28,28,248,22,71,23,197,2, -28,249,22,142,9,248,22,74,23,199,2,2,31,28,248,22,71,248,22,98,23, -198,2,249,22,142,9,248,22,102,23,199,2,2,4,11,11,11,86,98,23,199, -1,23,198,1,23,197,1,23,194,1,23,193,1,248,22,139,5,249,2,64,248, -22,115,23,200,2,248,22,100,23,200,1,28,28,248,22,71,23,197,2,28,249, -22,142,9,248,22,74,23,199,2,2,31,28,249,22,144,9,248,22,98,23,199, -2,2,33,28,23,197,2,27,248,22,140,5,23,199,2,28,248,22,58,193,10, -28,248,22,71,193,248,22,58,248,22,74,194,11,11,11,11,11,86,97,23,199, -1,23,198,1,23,194,1,23,193,1,27,248,22,140,5,23,199,1,248,22,139, -5,249,2,64,28,248,22,71,23,197,2,248,22,74,23,197,2,23,196,2,28, -248,22,71,23,197,2,249,22,87,248,22,75,23,199,1,248,22,100,23,203,1, -86,94,23,196,1,248,22,100,23,201,1,28,28,248,22,71,23,197,2,249,22, -142,9,248,22,74,23,199,2,2,35,11,86,94,23,193,1,86,94,28,208,12, -20,13,159,80,159,38,55,37,80,158,38,53,89,161,37,37,10,249,22,183,4, -21,94,2,36,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,213,200,201,202,203,80, -158,43,53,86,94,23,194,1,28,28,248,22,71,23,197,2,28,249,22,142,9, -248,22,74,23,199,2,2,31,28,248,22,71,248,22,98,23,198,2,249,22,142, -9,248,22,102,23,199,2,2,35,11,11,11,35,251,24,198,1,248,22,98,201, -23,202,2,23,203,1,23,204,1,27,248,22,140,5,23,200,1,28,248,22,71, -193,249,2,64,248,22,74,195,249,22,87,248,22,75,197,248,22,100,202,249,2, -64,194,248,22,100,200,86,94,23,193,1,27,88,163,8,36,37,47,11,79,115, -104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114,223,6,33, -68,27,28,248,22,71,23,199,2,28,249,22,142,9,2,31,248,22,74,23,201, -2,27,248,22,98,23,200,2,28,249,22,144,9,23,195,2,2,33,86,94,23, -193,1,28,23,200,2,27,248,22,140,5,23,202,2,28,248,22,71,193,248,22, -74,193,192,250,22,175,9,2,21,6,45,45,110,111,32,98,97,115,101,32,112, -97,116,104,32,102,111,114,32,114,101,108,97,116,105,118,101,32,115,117,98,109, -111,100,117,108,101,32,112,97,116,104,58,32,126,46,115,23,202,2,192,23,198, -2,23,198,2,27,28,248,22,71,23,200,2,28,249,22,142,9,2,31,248,22, -74,23,202,2,27,28,28,249,22,144,9,248,22,98,23,203,2,2,33,23,201, -2,11,27,248,22,140,5,23,203,2,28,248,22,71,23,194,2,249,2,64,248, -22,74,23,196,2,249,22,87,248,22,75,23,198,1,248,22,100,23,206,1,249, -2,64,23,195,1,248,22,100,23,204,1,249,2,64,2,33,248,22,100,23,203, -1,28,248,22,71,193,248,22,75,193,11,11,11,27,28,248,22,58,23,196,2, -27,248,80,159,44,46,39,249,22,73,23,199,2,247,22,137,15,28,23,193,2, -192,86,94,23,193,1,90,159,38,11,89,161,38,36,11,249,80,159,47,52,39, -248,22,64,23,201,2,11,27,28,248,22,81,23,195,2,2,37,249,22,155,7, -23,197,2,2,38,251,80,159,50,57,39,23,204,1,28,248,22,81,23,199,2, -23,199,1,86,94,23,199,1,248,22,74,23,199,2,28,248,22,81,23,199,2, -86,94,23,198,1,9,248,22,75,23,199,1,23,197,1,28,248,22,132,7,23, -196,2,86,94,23,196,1,27,248,80,159,44,8,26,39,23,203,2,27,248,80, -159,45,46,39,249,22,73,23,200,2,23,197,2,28,23,193,2,192,86,94,23, -193,1,90,159,38,11,89,161,38,36,11,249,80,159,48,52,39,23,201,2,11, -250,22,1,22,177,14,23,199,1,249,22,87,249,22,2,32,0,88,163,8,36, -37,44,11,9,222,33,69,23,200,1,248,22,83,248,2,70,23,201,1,28,248, -22,159,14,23,196,2,86,94,23,196,1,248,80,159,43,8,27,39,248,22,186, -14,28,248,22,183,14,23,198,2,23,197,2,249,22,184,14,23,199,2,248,80, -159,47,8,26,39,23,206,2,28,249,22,142,9,248,22,74,23,198,2,2,36, -27,248,80,159,44,46,39,249,22,73,23,199,2,247,22,137,15,28,23,193,2, -192,86,94,23,193,1,90,159,39,11,89,161,38,36,11,249,80,159,48,52,39, -248,22,98,23,202,2,11,89,161,37,38,11,28,248,22,81,248,22,100,23,201, -2,28,248,22,81,23,194,2,249,22,151,15,2,72,23,196,2,11,10,27,28, -23,196,2,248,2,70,23,196,2,28,248,22,81,23,195,2,2,37,28,249,22, -151,15,2,72,23,197,2,248,2,70,23,196,2,249,22,155,7,23,197,2,2, -38,27,28,23,197,1,86,94,23,196,1,249,22,87,28,248,22,81,248,22,100, -23,205,2,21,93,6,5,5,109,122,108,105,98,249,22,1,22,87,249,22,2, -80,159,54,8,28,39,248,22,100,23,208,2,23,197,1,28,248,22,81,23,196, -2,86,94,23,195,1,248,22,83,23,197,1,86,94,23,196,1,23,195,1,251, -80,159,52,57,39,23,206,1,248,22,74,23,198,2,248,22,75,23,198,1,23, -198,1,28,249,22,142,9,248,22,74,23,198,2,2,34,248,80,159,43,8,27, -39,248,22,186,14,249,22,184,14,248,22,188,14,248,22,98,23,201,2,248,80, -159,47,8,26,39,23,206,2,12,86,94,28,28,248,22,159,14,23,194,2,10, -248,22,157,8,23,194,2,86,94,23,202,1,12,28,23,202,2,250,22,177,9, -67,114,101,113,117,105,114,101,249,22,180,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,74,23,199,2, -2,39,23,205,1,86,94,23,202,1,250,22,178,9,2,21,249,22,180,7,6, -13,13,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2,248,22, -74,23,199,2,2,39,23,198,2,27,28,248,22,157,8,23,195,2,249,22,162, -8,23,196,2,36,249,22,186,14,248,22,187,14,23,197,2,11,27,28,248,22, -157,8,23,196,2,249,22,162,8,23,197,2,37,248,80,159,45,58,39,23,195, -2,90,159,39,11,89,161,39,36,11,28,248,22,157,8,23,199,2,250,22,7, -2,40,249,22,162,8,23,203,2,38,2,40,248,22,180,14,23,198,2,86,95, -23,195,1,23,193,1,27,28,248,22,157,8,23,200,2,249,22,162,8,23,201, -2,39,249,80,159,50,56,39,23,197,2,5,0,27,28,248,22,157,8,23,201, -2,249,22,162,8,23,202,2,40,248,22,139,5,23,200,2,27,250,22,153,2, -80,159,53,43,38,248,22,172,15,247,22,137,13,11,27,28,23,194,2,23,194, -1,86,94,23,194,1,27,247,22,133,2,86,94,250,22,151,2,80,159,55,43, -38,248,22,172,15,247,22,137,13,195,192,27,28,23,204,2,248,22,139,5,249, -22,73,248,22,140,5,23,200,2,23,207,2,23,196,2,86,95,28,23,213,1, -27,250,22,153,2,23,198,2,196,11,28,23,193,1,12,86,94,27,27,28,248, -22,17,80,159,56,49,38,80,159,55,49,38,247,22,19,251,22,27,11,80,159, -59,48,38,9,23,197,1,27,248,22,172,15,247,22,137,13,86,94,249,22,3, -20,20,94,88,163,8,36,37,55,11,9,226,14,13,2,3,33,73,23,195,1, -23,196,2,248,28,248,22,17,80,159,57,49,38,32,0,88,163,36,37,42,11, -9,222,33,74,80,159,56,8,29,39,20,20,95,88,163,36,36,55,8,176,64, -9,230,20,15,13,12,8,7,5,2,33,75,23,195,1,23,208,1,250,22,151, -2,23,198,1,196,10,12,28,28,248,22,157,8,23,204,1,11,28,248,22,132, -7,23,206,2,10,28,248,22,58,23,206,2,10,28,248,22,71,23,206,2,249, -22,142,9,248,22,74,23,208,2,2,36,11,249,80,159,54,47,39,28,248,22, -132,7,23,208,2,249,22,73,23,209,1,248,80,159,57,8,26,39,23,216,1, -86,94,23,213,1,249,22,73,23,209,1,247,22,137,15,252,22,159,8,23,209, -1,23,208,1,23,206,1,23,204,1,23,203,1,12,192,86,96,20,18,159,11, -80,158,36,53,248,80,159,37,8,25,37,249,22,27,11,80,159,39,55,37,248, -22,180,4,80,159,37,54,38,248,22,163,5,80,159,37,37,39,248,22,128,14, -80,159,37,42,39,20,18,159,11,80,158,36,53,248,80,159,37,8,25,37,249, -22,27,11,80,159,39,55,37,20,18,159,11,80,158,36,53,248,80,159,37,8, -25,37,249,22,27,11,80,159,39,55,37,159,36,20,113,159,36,16,1,11,16, -0,20,26,144,9,2,1,2,1,29,11,11,9,9,11,11,11,10,38,80,158, -36,36,20,113,159,40,16,26,2,2,2,3,30,2,5,72,112,97,116,104,45, -115,116,114,105,110,103,63,11,30,2,5,75,112,97,116,104,45,97,100,100,45, -115,117,102,102,105,120,8,30,2,7,2,8,6,30,2,7,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,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2, -19,2,20,2,21,30,2,22,2,8,6,30,2,5,79,112,97,116,104,45,114, -101,112,108,97,99,101,45,115,117,102,102,105,120,10,30,2,5,73,102,105,110, -100,45,99,111,108,45,102,105,108,101,3,30,2,5,76,110,111,114,109,97,108, -45,99,97,115,101,45,112,97,116,104,7,2,23,2,24,30,2,22,74,114,101, -112,97,114,97,109,101,116,101,114,105,122,101,7,16,0,37,39,36,16,0,36, -16,14,2,15,2,16,2,10,2,12,2,17,2,18,2,11,2,3,2,9,2, -2,2,13,2,14,2,19,2,21,50,11,11,11,16,3,2,23,2,20,2,24, -16,3,11,11,11,16,3,2,23,2,20,2,24,39,39,37,12,11,11,16,0, -16,0,16,0,36,36,11,12,11,11,16,0,16,0,16,0,36,36,16,21,20, -15,16,2,88,163,36,37,45,8,128,128,9,223,0,33,41,80,159,36,8,29, -39,20,15,16,2,88,163,8,36,37,45,8,240,0,0,1,0,9,223,0,33, -42,80,159,36,8,28,39,20,15,16,2,88,163,36,37,49,8,240,0,0,16, -0,72,112,97,116,104,45,115,115,45,62,114,107,116,223,0,33,43,80,159,36, -8,27,39,20,15,16,2,88,163,36,37,49,8,240,0,192,0,0,67,103,101, -116,45,100,105,114,223,0,33,44,80,159,36,8,26,39,20,15,16,2,248,22, -154,8,69,115,111,45,115,117,102,102,105,120,80,159,36,36,37,20,15,16,2, -88,163,36,38,8,38,8,61,2,3,223,0,33,53,80,159,36,37,37,20,15, -16,2,20,27,158,32,0,88,163,8,36,37,42,11,2,9,222,192,32,0,88, -163,8,36,37,42,11,2,9,222,192,80,159,36,42,37,20,15,16,2,247,22, -136,2,80,159,36,43,37,20,15,16,2,8,128,8,80,159,36,44,37,20,15, -16,2,249,22,158,8,8,128,8,11,80,159,36,45,37,20,15,16,2,88,163, -8,36,37,50,8,128,8,2,13,223,0,33,54,80,159,36,46,37,20,15,16, -2,88,163,8,36,38,55,8,128,8,2,14,223,0,33,55,80,159,36,47,37, -20,15,16,2,247,22,69,80,159,36,48,37,20,15,16,2,248,22,18,74,109, -111,100,117,108,101,45,108,111,97,100,105,110,103,80,159,36,49,37,20,15,16, -2,11,80,158,36,50,20,15,16,2,11,80,158,36,51,20,15,16,2,32,0, -88,163,36,38,8,25,11,2,19,222,33,61,80,159,36,52,37,20,15,16,2, -11,80,158,36,53,20,15,16,2,27,11,20,19,158,36,90,159,37,10,89,161, -37,36,10,20,25,96,2,21,88,163,8,36,37,51,8,128,2,9,224,2,1, -33,62,88,163,36,39,49,11,9,223,0,33,63,88,163,36,40,8,33,16,2, -8,176,242,8,187,241,9,225,2,1,0,33,76,207,80,159,36,54,37,20,15, -16,2,88,163,36,36,45,8,240,66,0,14,2,2,23,223,0,33,77,80,159, -36,59,37,20,15,16,2,20,27,158,88,163,8,36,36,45,8,240,0,0,10, -2,2,24,223,0,33,78,88,163,8,36,36,45,8,240,0,0,10,2,2,24, -223,0,33,79,80,159,36,8,24,37,96,29,94,2,4,68,35,37,107,101,114, -110,101,108,11,29,94,2,4,69,35,37,109,105,110,45,115,116,120,11,2,5, -2,22,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 7293); +32,112,97,116,104,58,32,126,46,115,250,22,84,2,31,28,249,22,144,9,23, +201,2,2,33,198,28,248,22,159,14,199,198,249,22,83,28,248,22,58,201,2, +4,2,34,200,199,251,2,65,196,197,248,22,75,199,248,22,75,200,251,2,65, +196,197,249,22,73,248,22,74,202,200,248,22,75,200,251,2,65,196,197,9,197, +27,249,22,155,7,6,31,31,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,58,32,196,28,193, +250,22,177,9,11,195,196,248,22,175,9,193,28,249,22,138,7,194,2,33,2, +27,28,249,22,138,7,194,2,32,62,117,112,192,32,70,88,163,8,36,37,50, +11,67,115,115,45,62,114,107,116,222,33,71,27,248,22,135,7,194,28,249,22, +188,3,194,39,28,249,22,138,7,6,3,3,46,115,115,249,22,154,7,197,249, +22,176,3,198,39,249,22,155,7,250,22,154,7,198,36,249,22,176,3,199,39, +2,38,193,193,0,8,35,114,120,34,91,46,93,34,28,249,22,144,9,248,22, +75,23,200,2,23,197,1,28,249,22,142,9,248,22,74,23,200,2,23,196,1, +251,22,175,9,2,21,6,28,28,99,121,99,108,101,32,105,110,32,108,111,97, +100,105,110,103,32,97,116,32,126,46,115,58,32,126,46,115,23,200,1,249,22, +2,22,75,248,22,88,249,22,73,23,206,1,23,202,1,12,12,247,192,20,13, +159,80,159,43,48,38,249,22,73,249,22,73,248,22,172,15,247,22,137,13,23, +201,1,23,195,1,20,13,159,80,159,43,40,37,250,80,159,46,41,37,249,22, +27,11,80,159,48,40,37,22,181,4,23,198,2,249,247,22,163,5,23,200,1, +27,248,22,61,248,22,163,14,23,201,1,28,23,202,2,28,250,22,153,2,23, +200,1,23,201,1,11,249,22,73,11,203,249,22,73,194,203,192,86,94,28,28, +248,22,159,14,23,197,2,10,248,22,148,5,23,197,2,12,28,23,198,2,250, +22,177,9,11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116, +104,23,201,2,250,22,178,9,2,21,6,19,19,109,111,100,117,108,101,45,112, +97,116,104,32,111,114,32,112,97,116,104,23,199,2,28,28,248,22,71,23,197, +2,249,22,142,9,248,22,74,23,199,2,2,4,11,248,22,139,5,248,22,98, +197,28,28,248,22,71,23,197,2,28,249,22,142,9,248,22,74,23,199,2,2, +31,28,248,22,71,248,22,98,23,198,2,249,22,142,9,248,22,102,23,199,2, +2,4,11,11,11,86,98,23,199,1,23,198,1,23,197,1,23,194,1,23,193, +1,248,22,139,5,249,2,64,248,22,115,23,200,2,248,22,100,23,200,1,28, +28,248,22,71,23,197,2,28,249,22,142,9,248,22,74,23,199,2,2,31,28, +28,249,22,144,9,248,22,98,23,199,2,2,33,10,249,22,144,9,248,22,98, +23,199,2,2,32,28,23,197,2,27,248,22,140,5,23,199,2,28,248,22,58, +193,10,28,248,22,71,193,248,22,58,248,22,74,194,11,11,11,11,11,86,97, +23,199,1,23,198,1,23,194,1,23,193,1,27,248,22,140,5,23,199,1,248, +22,139,5,249,2,64,28,248,22,71,23,197,2,248,22,74,23,197,2,23,196, +2,27,28,249,22,144,9,248,22,98,23,204,2,2,32,248,22,75,201,248,22, +100,201,28,248,22,71,23,198,2,249,22,87,248,22,75,199,194,192,28,28,248, +22,71,23,197,2,249,22,142,9,248,22,74,23,199,2,2,35,11,86,94,23, +193,1,86,94,28,208,12,20,13,159,80,159,38,55,37,80,158,38,53,89,161, +37,37,10,249,22,183,4,21,94,2,36,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,213,200,201,202,203,80,158,43,53,86,94,23,194,1,28,28,248,22,71,23, +197,2,28,249,22,142,9,248,22,74,23,199,2,2,31,28,248,22,71,248,22, +98,23,198,2,249,22,142,9,248,22,102,23,199,2,2,35,11,11,11,35,251, +24,198,1,248,22,98,201,23,202,2,23,203,1,23,204,1,27,248,22,140,5, +23,200,1,28,248,22,71,193,249,2,64,248,22,74,195,249,22,87,248,22,75, +197,248,22,100,202,249,2,64,194,248,22,100,200,86,94,23,193,1,27,88,163, +8,36,37,47,11,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110, +45,101,114,114,223,6,33,68,27,28,248,22,71,23,199,2,28,249,22,142,9, +2,31,248,22,74,23,201,2,27,248,22,98,23,200,2,28,28,249,22,144,9, +23,195,2,2,33,10,249,22,144,9,23,195,2,2,32,86,94,23,193,1,28, +23,200,2,27,248,22,140,5,23,202,2,28,248,22,71,193,248,22,74,193,192, +250,22,175,9,2,21,6,45,45,110,111,32,98,97,115,101,32,112,97,116,104, +32,102,111,114,32,114,101,108,97,116,105,118,101,32,115,117,98,109,111,100,117, +108,101,32,112,97,116,104,58,32,126,46,115,23,202,2,192,23,198,2,23,198, +2,27,28,248,22,71,23,200,2,28,249,22,142,9,2,31,248,22,74,23,202, +2,27,28,28,28,249,22,144,9,248,22,98,23,203,2,2,33,10,249,22,144, +9,248,22,98,23,203,2,2,32,23,201,2,11,27,248,22,140,5,23,203,2, +27,28,249,22,144,9,248,22,98,23,205,2,2,32,248,22,75,23,203,1,248, +22,100,23,203,1,28,248,22,71,23,195,2,249,2,64,248,22,74,23,197,2, +249,22,87,248,22,75,23,199,1,23,197,1,249,2,64,23,196,1,23,195,1, +249,2,64,2,33,28,249,22,144,9,248,22,98,23,205,2,2,32,248,22,75, +23,203,1,248,22,100,23,203,1,28,248,22,71,193,248,22,75,193,11,11,11, +27,28,248,22,58,23,196,2,27,248,80,159,44,46,39,249,22,73,23,199,2, +247,22,137,15,28,23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38, +36,11,249,80,159,47,52,39,248,22,64,23,201,2,11,27,28,248,22,81,23, +195,2,2,37,249,22,155,7,23,197,2,2,38,251,80,159,50,57,39,23,204, +1,28,248,22,81,23,199,2,23,199,1,86,94,23,199,1,248,22,74,23,199, +2,28,248,22,81,23,199,2,86,94,23,198,1,9,248,22,75,23,199,1,23, +197,1,28,248,22,132,7,23,196,2,86,94,23,196,1,27,248,80,159,44,8, +26,39,23,203,2,27,248,80,159,45,46,39,249,22,73,23,200,2,23,197,2, +28,23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38,36,11,249,80, +159,48,52,39,23,201,2,11,250,22,1,22,177,14,23,199,1,249,22,87,249, +22,2,32,0,88,163,8,36,37,44,11,9,222,33,69,23,200,1,248,22,83, +248,2,70,23,201,1,28,248,22,159,14,23,196,2,86,94,23,196,1,248,80, +159,43,8,27,39,248,22,186,14,28,248,22,183,14,23,198,2,23,197,2,249, +22,184,14,23,199,2,248,80,159,47,8,26,39,23,206,2,28,249,22,142,9, +248,22,74,23,198,2,2,36,27,248,80,159,44,46,39,249,22,73,23,199,2, +247,22,137,15,28,23,193,2,192,86,94,23,193,1,90,159,39,11,89,161,38, +36,11,249,80,159,48,52,39,248,22,98,23,202,2,11,89,161,37,38,11,28, +248,22,81,248,22,100,23,201,2,28,248,22,81,23,194,2,249,22,151,15,2, +72,23,196,2,11,10,27,28,23,196,2,248,2,70,23,196,2,28,248,22,81, +23,195,2,2,37,28,249,22,151,15,2,72,23,197,2,248,2,70,23,196,2, +249,22,155,7,23,197,2,2,38,27,28,23,197,1,86,94,23,196,1,249,22, +87,28,248,22,81,248,22,100,23,205,2,21,93,6,5,5,109,122,108,105,98, +249,22,1,22,87,249,22,2,80,159,54,8,28,39,248,22,100,23,208,2,23, +197,1,28,248,22,81,23,196,2,86,94,23,195,1,248,22,83,23,197,1,86, +94,23,196,1,23,195,1,251,80,159,52,57,39,23,206,1,248,22,74,23,198, +2,248,22,75,23,198,1,23,198,1,28,249,22,142,9,248,22,74,23,198,2, +2,34,248,80,159,43,8,27,39,248,22,186,14,249,22,184,14,248,22,188,14, +248,22,98,23,201,2,248,80,159,47,8,26,39,23,206,2,12,86,94,28,28, +248,22,159,14,23,194,2,10,248,22,157,8,23,194,2,86,94,23,202,1,12, +28,23,202,2,250,22,177,9,67,114,101,113,117,105,114,101,249,22,180,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,74,23,199,2,2,39,23,205,1,86,94,23,202,1,250,22,178, +9,2,21,249,22,180,7,6,13,13,109,111,100,117,108,101,32,112,97,116,104, +126,97,28,23,198,2,248,22,74,23,199,2,2,39,23,198,2,27,28,248,22, +157,8,23,195,2,249,22,162,8,23,196,2,36,249,22,186,14,248,22,187,14, +23,197,2,11,27,28,248,22,157,8,23,196,2,249,22,162,8,23,197,2,37, +248,80,159,45,58,39,23,195,2,90,159,39,11,89,161,39,36,11,28,248,22, +157,8,23,199,2,250,22,7,2,40,249,22,162,8,23,203,2,38,2,40,248, +22,180,14,23,198,2,86,95,23,195,1,23,193,1,27,28,248,22,157,8,23, +200,2,249,22,162,8,23,201,2,39,249,80,159,50,56,39,23,197,2,5,0, +27,28,248,22,157,8,23,201,2,249,22,162,8,23,202,2,40,248,22,139,5, +23,200,2,27,250,22,153,2,80,159,53,43,38,248,22,172,15,247,22,137,13, +11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,247,22,133,2,86,94, +250,22,151,2,80,159,55,43,38,248,22,172,15,247,22,137,13,195,192,27,28, +23,204,2,248,22,139,5,249,22,73,248,22,140,5,23,200,2,23,207,2,23, +196,2,86,95,28,23,213,1,27,250,22,153,2,23,198,2,196,11,28,23,193, +1,12,86,94,27,27,28,248,22,17,80,159,56,49,38,80,159,55,49,38,247, +22,19,251,22,27,11,80,159,59,48,38,9,23,197,1,27,248,22,172,15,247, +22,137,13,86,94,249,22,3,20,20,94,88,163,8,36,37,55,11,9,226,14, +13,2,3,33,73,23,195,1,23,196,2,248,28,248,22,17,80,159,57,49,38, +32,0,88,163,36,37,42,11,9,222,33,74,80,159,56,8,29,39,20,20,95, +88,163,36,36,55,8,176,64,9,230,20,15,13,12,8,7,5,2,33,75,23, +195,1,23,208,1,250,22,151,2,23,198,1,196,10,12,28,28,248,22,157,8, +23,204,1,11,28,248,22,132,7,23,206,2,10,28,248,22,58,23,206,2,10, +28,248,22,71,23,206,2,249,22,142,9,248,22,74,23,208,2,2,36,11,249, +80,159,54,47,39,28,248,22,132,7,23,208,2,249,22,73,23,209,1,248,80, +159,57,8,26,39,23,216,1,86,94,23,213,1,249,22,73,23,209,1,247,22, +137,15,252,22,159,8,23,209,1,23,208,1,23,206,1,23,204,1,23,203,1, +12,192,86,96,20,18,159,11,80,158,36,53,248,80,159,37,8,25,37,249,22, +27,11,80,159,39,55,37,248,22,180,4,80,159,37,54,38,248,22,163,5,80, +159,37,37,39,248,22,128,14,80,159,37,42,39,20,18,159,11,80,158,36,53, +248,80,159,37,8,25,37,249,22,27,11,80,159,39,55,37,20,18,159,11,80, +158,36,53,248,80,159,37,8,25,37,249,22,27,11,80,159,39,55,37,159,36, +20,113,159,36,16,1,11,16,0,20,26,144,9,2,1,2,1,29,11,11,9, +9,11,11,11,10,38,80,158,36,36,20,113,159,40,16,26,2,2,2,3,30, +2,5,72,112,97,116,104,45,115,116,114,105,110,103,63,11,30,2,5,75,112, +97,116,104,45,97,100,100,45,115,117,102,102,105,120,8,30,2,7,2,8,6, +30,2,7,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,9,2,10,2,11,2,12,2,13,2,14,2, +15,2,16,2,17,2,18,2,19,2,20,2,21,30,2,22,2,8,6,30,2, +5,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120, +10,30,2,5,73,102,105,110,100,45,99,111,108,45,102,105,108,101,3,30,2, +5,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,7,2,23, +2,24,30,2,22,74,114,101,112,97,114,97,109,101,116,101,114,105,122,101,7, +16,0,37,39,36,16,0,36,16,14,2,15,2,16,2,10,2,12,2,17,2, +18,2,11,2,3,2,9,2,2,2,13,2,14,2,19,2,21,50,11,11,11, +16,3,2,23,2,20,2,24,16,3,11,11,11,16,3,2,23,2,20,2,24, +39,39,37,12,11,11,16,0,16,0,16,0,36,36,11,12,11,11,16,0,16, +0,16,0,36,36,16,21,20,15,16,2,88,163,36,37,45,8,128,128,9,223, +0,33,41,80,159,36,8,29,39,20,15,16,2,88,163,8,36,37,45,8,240, +0,0,1,0,9,223,0,33,42,80,159,36,8,28,39,20,15,16,2,88,163, +36,37,49,8,240,0,0,16,0,72,112,97,116,104,45,115,115,45,62,114,107, +116,223,0,33,43,80,159,36,8,27,39,20,15,16,2,88,163,36,37,49,8, +240,0,192,0,0,67,103,101,116,45,100,105,114,223,0,33,44,80,159,36,8, +26,39,20,15,16,2,248,22,154,8,69,115,111,45,115,117,102,102,105,120,80, +159,36,36,37,20,15,16,2,88,163,36,38,8,38,8,61,2,3,223,0,33, +53,80,159,36,37,37,20,15,16,2,20,27,158,32,0,88,163,8,36,37,42, +11,2,9,222,192,32,0,88,163,8,36,37,42,11,2,9,222,192,80,159,36, +42,37,20,15,16,2,247,22,136,2,80,159,36,43,37,20,15,16,2,8,128, +8,80,159,36,44,37,20,15,16,2,249,22,158,8,8,128,8,11,80,159,36, +45,37,20,15,16,2,88,163,8,36,37,50,8,128,8,2,13,223,0,33,54, +80,159,36,46,37,20,15,16,2,88,163,8,36,38,55,8,128,8,2,14,223, +0,33,55,80,159,36,47,37,20,15,16,2,247,22,69,80,159,36,48,37,20, +15,16,2,248,22,18,74,109,111,100,117,108,101,45,108,111,97,100,105,110,103, +80,159,36,49,37,20,15,16,2,11,80,158,36,50,20,15,16,2,11,80,158, +36,51,20,15,16,2,32,0,88,163,36,38,8,25,11,2,19,222,33,61,80, +159,36,52,37,20,15,16,2,11,80,158,36,53,20,15,16,2,27,11,20,19, +158,36,90,159,37,10,89,161,37,36,10,20,25,96,2,21,88,163,8,36,37, +51,8,128,2,9,224,2,1,33,62,88,163,36,39,49,11,9,223,0,33,63, +88,163,36,40,8,33,16,2,8,176,242,8,187,241,9,225,2,1,0,33,76, +207,80,159,36,54,37,20,15,16,2,88,163,36,36,45,8,240,66,0,14,2, +2,23,223,0,33,77,80,159,36,59,37,20,15,16,2,20,27,158,88,163,8, +36,36,45,8,240,0,0,10,2,2,24,223,0,33,78,88,163,8,36,36,45, +8,240,0,0,10,2,2,24,223,0,33,79,80,159,36,8,24,37,96,29,94, +2,4,68,35,37,107,101,114,110,101,108,11,29,94,2,4,69,35,37,109,105, +110,45,115,116,120,11,2,5,2,22,9,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 7385); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,49,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,53,46,50,46,57,48,48,46,50,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,1,0,0,10,0, 16,0,29,0,44,0,58,0,78,0,90,0,104,0,118,0,170,0,0,0,97, 1,0,0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94, @@ -986,7 +990,7 @@ 2,2,74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,11,29,94,2, 2,66,35,37,98,111,111,116,11,29,94,2,2,68,35,37,101,120,112,111,98, 115,11,29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240, -151,79,0,0,100,159,2,3,36,36,159,2,4,36,36,159,2,5,36,36,159, +235,83,0,0,100,159,2,3,36,36,159,2,4,36,36,159,2,5,36,36,159, 2,6,36,36,159,2,7,36,36,159,2,8,36,36,159,2,9,36,36,159,2, 9,36,36,16,0,159,36,20,113,159,36,16,1,11,16,0,20,26,144,9,2, 1,2,1,29,11,11,9,9,11,11,11,18,96,11,46,46,46,36,80,158,36, diff --git a/src/racket/src/module.c b/src/racket/src/module.c index 8def8d4865..1097bf9991 100644 --- a/src/racket/src/module.c +++ b/src/racket/src/module.c @@ -2305,30 +2305,32 @@ int scheme_is_module_path(Scheme_Object *obj) if (SCHEME_PAIRP(obj) && (SAME_OBJ(SCHEME_CAR(obj), submod_symbol))) { Scheme_Object *p, *a; + int len = 0; p = SCHEME_CDR(obj); if (SCHEME_PAIRP(p)) { p = SCHEME_CDR(p); - if (SCHEME_PAIRP(p)) { - while (SCHEME_PAIRP(p)) { - a = SCHEME_CAR(p); - if (!SCHEME_SYMBOLP(a) - && (!SCHEME_CHAR_STRINGP(a) - || (SCHEME_CHAR_STRLEN_VAL(a) != 2) - || (SCHEME_CHAR_STR_VAL(a)[0] != '.') - || (SCHEME_CHAR_STR_VAL(a)[1] != '.'))) - break; - p = SCHEME_CDR(p); - } - } else - p = scheme_false; + while (SCHEME_PAIRP(p)) { + len++; + a = SCHEME_CAR(p); + if (!SCHEME_SYMBOLP(a) + && (!SCHEME_CHAR_STRINGP(a) + || (SCHEME_CHAR_STRLEN_VAL(a) != 2) + || (SCHEME_CHAR_STR_VAL(a)[0] != '.') + || (SCHEME_CHAR_STR_VAL(a)[1] != '.'))) + break; + p = SCHEME_CDR(p); + } } else p = scheme_false; if (SCHEME_NULLP(p)) { obj = SCHEME_CDR(obj); obj = SCHEME_CAR(obj); if (SCHEME_CHAR_STRINGP(obj) - && (SCHEME_CHAR_STRLEN_VAL(obj) == 1) - && (SCHEME_CHAR_STR_VAL(obj)[0] == '.')) + && (((SCHEME_CHAR_STRLEN_VAL(obj) == 1) + && (SCHEME_CHAR_STR_VAL(obj)[0] == '.')) + || ((SCHEME_CHAR_STRLEN_VAL(obj) == 2) + && (SCHEME_CHAR_STR_VAL(obj)[0] == '.') + && (SCHEME_CHAR_STR_VAL(obj)[1] == '.')))) return 1; } } @@ -6512,9 +6514,8 @@ static Scheme_Object *do_module(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Object *rn; iidx = scheme_make_modidx(scheme_make_pair(submod_symbol, - scheme_make_pair(scheme_make_utf8_string("."), - scheme_make_pair(scheme_make_utf8_string(".."), - scheme_null))), + scheme_make_pair(scheme_make_utf8_string(".."), + scheme_null)), self_modidx, scheme_false); diff --git a/src/racket/src/schvers.h b/src/racket/src/schvers.h index 5c5f3fb4c7..f5309022e7 100644 --- a/src/racket/src/schvers.h +++ b/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "5.2.900.1" +#define MZSCHEME_VERSION "5.2.900.2" #define MZSCHEME_VERSION_X 5 #define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Z 900 -#define MZSCHEME_VERSION_W 1 +#define MZSCHEME_VERSION_W 2 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) diff --git a/src/racket/src/startup.inc b/src/racket/src/startup.inc index e90268b810..d4c16ae0a8 100644 --- a/src/racket/src/startup.inc +++ b/src/racket/src/startup.inc @@ -839,7 +839,9 @@ "(list* 'submod" " (if (equal? base \".\") " " base " -"(list(if(symbol? base) 'quote 'file) base))" +"(if(path? base)" +" base" +"(list(if(symbol? base) 'quote 'file) base)))" " orig-l))" "(loop(cdr a)(cdr l))))" "(else(loop(cons(car l) a)(cdr l))))))" @@ -850,16 +852,20 @@ "(pair?(cadr s))(eq?(caadr s) 'quote))" "(make-resolved-module-path(flatten-sub-path(cadadr s)(cddr s))))" "((and(pair? s)(eq?(car s) 'submod)" -" (equal? (cadr s) \".\")" +" (or (equal? (cadr s) \".\")" +" (equal? (cadr s) \"..\"))" "(and relto" "(let((p(resolved-module-path-name relto)))" "(or(symbol? p)" "(and(pair? p)(symbol?(car p)))))))" "(define rp(resolved-module-path-name relto))" "(make-resolved-module-path(flatten-sub-path(if(pair? rp)(car rp) rp)" +" (let ((r (if (equal? (cadr s) \"..\")" +"(cdr s)" +"(cddr s))))" "(if(pair? rp)" -"(append(cdr rp)(cddr s))" -"(cddr s)))))" +"(append(cdr rp) r)" +" r)))))" "((and(pair? s)(eq?(car s) 'planet))" "(unless planet-resolver" "(with-continuation-mark" @@ -910,7 +916,8 @@ " p))))" "(s(if(and(pair? s)(eq? 'submod(car s)))" "(let((v(cadr s)))" -" (if (equal? v \".\")" +" (if (or (equal? v \".\")" +" (equal? v \"..\"))" "(if relto" "(let((p(resolved-module-path-name relto)))" "(if(pair? p)" @@ -922,13 +929,20 @@ " v))" " s))" "(subm-path(if(and(pair? s)(eq? 'submod(car s)))" -" (let ((p (if (and (equal? (cadr s) \".\")" +" (let ((p (if (and (or (equal? (cadr s) \".\")" +" (equal? (cadr s) \"..\"))" " relto)" -"(let((p(resolved-module-path-name relto)))" +"(let((p(resolved-module-path-name relto))" +" (r (if (equal? (cadr s) \"..\")" +"(cdr s)" +"(cddr s))))" "(if(pair? p)" -"(flatten-sub-path(car p)(append(cdr p)(cddr s)))" -"(flatten-sub-path p(cddr s))))" -" (flatten-sub-path \".\" (cddr s)))))" +"(flatten-sub-path(car p)(append(cdr p) r))" +"(flatten-sub-path p r)))" +" (flatten-sub-path \".\" " +" (if (equal? (cadr s) \"..\")" +"(cdr s)" +"(cddr s))))))" "(if(pair? p)" "(cdr p)" " #f))" diff --git a/src/racket/src/startup.rktl b/src/racket/src/startup.rktl index d35d98cef3..60cc42d19f 100644 --- a/src/racket/src/startup.rktl +++ b/src/racket/src/startup.rktl @@ -967,7 +967,9 @@ (list* 'submod (if (equal? base ".") base - (list (if (symbol? base) 'quote 'file) base)) + (if (path? base) + base + (list (if (symbol? base) 'quote 'file) base))) orig-l)) (loop (cdr a) (cdr l)))] [else (loop (cons (car l) a) (cdr l))]))) @@ -978,16 +980,20 @@ (pair? (cadr s)) (eq? (caadr s) 'quote)) (make-resolved-module-path (flatten-sub-path (cadadr s) (cddr s)))] [(and (pair? s) (eq? (car s) 'submod) - (equal? (cadr s) ".") + (or (equal? (cadr s) ".") + (equal? (cadr s) "..")) (and relto (let ([p (resolved-module-path-name relto)]) (or (symbol? p) (and (pair? p) (symbol? (car p))))))) (define rp (resolved-module-path-name relto)) (make-resolved-module-path (flatten-sub-path (if (pair? rp) (car rp) rp) - (if (pair? rp) - (append (cdr rp) (cddr s)) - (cddr s))))] + (let ([r (if (equal? (cadr s) "..") + (cdr s) + (cddr s))]) + (if (pair? rp) + (append (cdr rp) r) + r))))] [(and (pair? s) (eq? (car s) 'planet)) (unless planet-resolver (with-continuation-mark @@ -1038,7 +1044,8 @@ p)))] [s (if (and (pair? s) (eq? 'submod (car s))) (let ([v (cadr s)]) - (if (equal? v ".") + (if (or (equal? v ".") + (equal? v "..")) (if relto ;; must have a path inside, or we wouldn't get here (let ([p (resolved-module-path-name relto)]) @@ -1051,13 +1058,20 @@ v)) s)] [subm-path (if (and (pair? s) (eq? 'submod (car s))) - (let ([p (if (and (equal? (cadr s) ".") + (let ([p (if (and (or (equal? (cadr s) ".") + (equal? (cadr s) "..")) relto) - (let ([p (resolved-module-path-name relto)]) + (let ([p (resolved-module-path-name relto)] + [r (if (equal? (cadr s) "..") + (cdr s) + (cddr s))]) (if (pair? p) - (flatten-sub-path (car p) (append (cdr p) (cddr s))) - (flatten-sub-path p (cddr s)))) - (flatten-sub-path "." (cddr s)))]) + (flatten-sub-path (car p) (append (cdr p) r)) + (flatten-sub-path p r))) + (flatten-sub-path "." + (if (equal? (cadr s) "..") + (cdr s) + (cddr s))))]) ;; flattening may erase the submodule path: (if (pair? p) (cdr p)