diff --git a/collects/lang/htdp-reader.rkt b/collects/lang/htdp-reader.rkt index 877a30178c..e8f53ea198 100644 --- a/collects/lang/htdp-reader.rkt +++ b/collects/lang/htdp-reader.rkt @@ -10,11 +10,12 @@ read)) (define (get-all-exps source-name port) - (let loop () - (let ([exp (read-syntax source-name port)]) - (cond - [(eof-object? exp) null] - [else (cons exp (loop))])))) + (parameterize ([read-accept-lang #f]) + (let loop () + (let ([exp (read-syntax source-name port)]) + (cond + [(eof-object? exp) null] + [else (cons exp (loop))]))))) (define (lookup key table) (let ([ans (assoc key table)]) diff --git a/collects/lang/run-teaching-program.rkt b/collects/lang/run-teaching-program.rkt index 8cc78a3842..7377beecd8 100644 --- a/collects/lang/run-teaching-program.rkt +++ b/collects/lang/run-teaching-program.rkt @@ -90,7 +90,8 @@ ;; take all of the body expressions from the port (define (suck-all-exps port reader) - (define (port-reader p) (reader (object-name port) p)) + (define (port-reader p) (parameterize ([read-accept-lang #f]) + (reader (object-name port) p))) (sequence->list (in-port port-reader port))) ;; check that the teachpacks exist, return diff --git a/collects/syntax/module-reader.rkt b/collects/syntax/module-reader.rkt index fab4db55b5..953e7983db 100644 --- a/collects/syntax/module-reader.rkt +++ b/collects/syntax/module-reader.rkt @@ -175,12 +175,13 @@ (let* ([lang (if stx? (datum->syntax #f lang modpath modpath) lang)] [body (lambda () (if whole? - (read port) - (let loop ([a null]) - (let ([v (read port)]) - (if (eof-object? v) - (reverse a) - (loop (cons v a)))))))] + (read port) + (parameterize ([read-accept-lang #f]) + (let loop ([a null]) + (let ([v (read port)]) + (if (eof-object? v) + (reverse a) + (loop (cons v a))))))))] [body (cond [(not wrapper) (body)] [(ar? wrapper 2) (wrapper body stx?)] [else (wrapper body)])] diff --git a/collects/syntax/scribblings/module-reader.scrbl b/collects/syntax/scribblings/module-reader.scrbl index f8478da85a..455ee0ca8e 100644 --- a/collects/syntax/scribblings/module-reader.scrbl +++ b/collects/syntax/scribblings/module-reader.scrbl @@ -94,7 +94,12 @@ identifiers used by the @racket[reader-option]s. @racket[read-syntax], respectively. Normally, the replacements for @racket[read] and @racket[read-syntax] are applied repeatedly to the module source until @racket[eof] is produced, - but see also @racket[#:whole-body-readers?]. + but see also @racket[#:whole-body-readers?]. + + Unless @racket[#:whole-body-readers?] specifies a true value, + the repeated use of @racket[read] or @racket[read-syntax] is + @racket[parameterize]d to set @racket[read-accept-lang] to + @racket[#f], which disables nested uses of @hash-lang[]. See also @racket[#:wrapper1] and @racket[#:wrapper2], which support simple parameterization of readers rather than diff --git a/doc/release-notes/racket/HISTORY.txt b/doc/release-notes/racket/HISTORY.txt index 94f73cb6d8..1a04040860 100644 --- a/doc/release-notes/racket/HISTORY.txt +++ b/doc/release-notes/racket/HISTORY.txt @@ -1,6 +1,9 @@ Version 5.3.0.10 racket/base: add progress-evt?, thread-cell-values?, prefab-key?, semaphore-peek-evt?, channel-put-evt? +Changed #lang for most languages so that it cannot be nested; + this change is within syntax/module-reader and applies to + racket, racket/base, and more Version 5.3.0.9 Changed the format of error messages diff --git a/src/racket/src/read.c b/src/racket/src/read.c index ed0573f1de..eb830959fe 100644 --- a/src/racket/src/read.c +++ b/src/racket/src/read.c @@ -2184,14 +2184,19 @@ _internal_read(Scheme_Object *port, Scheme_Object *stxsrc, int crc, int cant_fai else params.table = NULL; } - params.can_read_compiled = crc; + if (crc >= 0) + params.can_read_compiled = crc; + else { + v = scheme_get_param(scheme_current_config(), MZCONFIG_CAN_READ_COMPILED); + params.can_read_compiled = SCHEME_TRUEP(v); + } v = scheme_get_param(config, MZCONFIG_CAN_READ_PIPE_QUOTE); params.can_read_pipe_quote = SCHEME_TRUEP(v); v = scheme_get_param(config, MZCONFIG_CAN_READ_BOX); params.can_read_box = SCHEME_TRUEP(v); v = scheme_get_param(config, MZCONFIG_CAN_READ_GRAPH); params.can_read_graph = SCHEME_TRUEP(v); - if (crc || get_info) { + if ((crc > 0) || get_info) { params.can_read_reader = 1; params.can_read_lang = 1; } else { @@ -2329,9 +2334,6 @@ scheme_internal_read(Scheme_Object *port, Scheme_Object *stxsrc, int crc, int ca { Scheme_Thread *p = scheme_current_thread; - if (crc < 0) - crc = SCHEME_TRUEP(scheme_get_param(scheme_current_config(), MZCONFIG_CAN_READ_COMPILED)); - if (cantfail) { return _internal_read(port, stxsrc, crc, cantfail, recur, expose_comment, -1, NULL, magic_sym, magic_val, delay_load_info, 0);