diff --git a/collects/scribble/doc.txt b/collects/scribble/doc.txt index 6f397d2ff8..4861b29fcb 100644 --- a/collects/scribble/doc.txt +++ b/collects/scribble/doc.txt @@ -701,8 +701,6 @@ resulting reader in several ways. #'cmd)]) (syntax/loc stx (mk-cmd rest ...)))])) -* #:start-inside? -- used internally by the above `-inside' variants. - > (use-at-readtable [keyword-args]) Installs the Scribble readtable as the default. Useful for REPL diff --git a/collects/scribble/reader.ss b/collects/scribble/reader.ss index fe4bf7ba57..ef4bf305ae 100644 --- a/collects/scribble/reader.ss +++ b/collects/scribble/reader.ss @@ -506,17 +506,26 @@ ;; ---------------------------------------------------------------------------- ;; readtable -(provide make-at-readtable) -(define (make-at-readtable - #:readtable [readtable (current-readtable)] - #:command-char [command-char ch:command] - #:start-inside? [start-inside? #f] - #:datum-readtable [datum-readtable #t] - #:syntax-post-processor [syntax-post-processor values]) +(provide make-at-readtable make-at-reader/inside) + +(define default-src (gensym 'scribble-reader)) +(define (src-name src port) + (if (eq? src default-src) (object-name port) src)) + +(define ((make-at-readtable-or-inside-reader inside-reader?) + readtable command-char datum-readtable syntax-post-processor) (define dispatcher - (make-dispatcher start-inside? command-char - (lambda () cmd-rt) (lambda () datum-rt) + (make-dispatcher #f command-char (lambda () cmd-rt) (lambda () datum-rt) syntax-post-processor)) + (define (make-inside-reader) + (define dispatcher + (make-dispatcher #t command-char (lambda () cmd-rt) (lambda () datum-rt) + syntax-post-processor)) + (define (inside-reader [src default-src] [inp (current-input-port)]) + (define-values [line col pos] (port-next-location inp)) + (parameterize ([current-readtable at-rt]) + (dispatcher #f inp (src-name src inp) line col pos))) + inside-reader) (define at-rt (make-readtable readtable command-char 'non-terminating-macro dispatcher)) (define cmd-rt @@ -544,7 +553,23 @@ [(procedure? datum-readtable) (datum-readtable at-rt)] [else (error 'make-at-readtable "bad datum-readtable: ~e" datum-readtable)])) - at-rt) + (if inside-reader? (make-inside-reader) at-rt)) + +(define (make-at-readtable + #:readtable [readtable (current-readtable)] + #:command-char [command-char ch:command] + #:datum-readtable [datum-readtable #t] + #:syntax-post-processor [syntax-post-processor values]) + ((make-at-readtable-or-inside-reader #f) + readtable command-char datum-readtable syntax-post-processor)) + +(define (make-at-reader/inside + #:readtable [readtable (current-readtable)] + #:command-char [command-char ch:command] + #:datum-readtable [datum-readtable #t] + #:syntax-post-processor [syntax-post-processor values]) + ((make-at-readtable-or-inside-reader #t) + readtable command-char datum-readtable syntax-post-processor)) (provide use-at-readtable) (define use-at-readtable @@ -556,51 +581,23 @@ ;; utilities for below (define make-default-at-readtable - (readtable-cached - (lambda (rt) (make-at-readtable #:readtable rt)))) -(define make-default-at-dispatcher/inside - (readtable-cached - (lambda (rt) - (let-values ([(_1 disp _2) - (readtable-mapping - (make-at-readtable #:readtable rt #:start-inside? #t) - ch:command)]) - disp)))) + (readtable-cached (lambda (rt) (make-at-readtable #:readtable rt)))) +(define make-default-at-reader/inside + (readtable-cached (lambda (rt) (make-at-reader/inside #:readtable rt)))) ;; ---------------------------------------------------------------------------- ;; readers -(define default-src (gensym 'scribble-reader)) -(define (src-name src port) - (if (eq? src default-src) (object-name port) src)) - -(define-syntax with-at-reader - (syntax-rules () - [(_ body ...) - (parameterize ([current-readtable (make-default-at-readtable)]) - body ...)])) - +(provide (rename-out [*read read] [*read-syntax read-syntax])) (define (*read [inp (current-input-port)]) - (with-at-reader (read inp))) - -(define (*read-syntax [src default-src] - [inp (current-input-port)]) - (with-at-reader (read-syntax (src-name src inp) inp))) + (parameterize ([current-readtable (make-default-at-readtable)]) + (read inp))) +(define (*read-syntax [src default-src] [inp (current-input-port)]) + (parameterize ([current-readtable (make-default-at-readtable)]) + (read-syntax (src-name src inp) inp))) +(provide read-inside read-syntax-inside) (define (read-inside [inp (current-input-port)]) - (let*-values ([(line col pos) (port-next-location inp)] - [(inside-dispatcher) (make-default-at-dispatcher/inside)]) - (with-at-reader - (syntax->datum - (inside-dispatcher #f inp (object-name inp) line col pos))))) - -(define (read-syntax-inside [src default-src] - [inp (current-input-port)]) - (let*-values ([(line col pos) (port-next-location inp)] - [(inside-dispatcher) (make-default-at-dispatcher/inside)]) - (with-at-reader - (inside-dispatcher #f inp (src-name src inp) line col pos)))) - -(provide (rename-out [*read read] - [*read-syntax read-syntax]) - read-inside read-syntax-inside) + (syntax->datum ((make-default-at-reader/inside) default-src inp))) +(define (read-syntax-inside [src default-src] [inp (current-input-port)]) + ((make-default-at-reader/inside) src inp)) diff --git a/collects/scribblings/scribble/reader.scrbl b/collects/scribblings/scribble/reader.scrbl index 31293ff1ad..76e591551d 100644 --- a/collects/scribblings/scribble/reader.scrbl +++ b/collects/scribblings/scribble/reader.scrbl @@ -891,14 +891,16 @@ Useful for implementing languages that are textual by default (see @filepath{docreader.ss} for example). } -@defproc[(make-at-readtable [#:readtable readtable readtable? (current-readtable)] - [#:command-char command-char character? #\@] - [#:start-inside? start-inside? any/c #f] - [#:datum-readtable datum-readtable - (or/c readtable? boolean? - (readtable? . -> . readtable?)) - #t] - [#:syntax-post-processor syntax-post-proc (syntax? . -> . syntax?) values]) +@defproc[(make-at-readtable + [#:readtable readtable readtable? (current-readtable)] + [#:command-char command-char character? #\@] + [#:datum-readtable datum-readtable + (or/c readtable? boolean? + (readtable? . -> . readtable?)) + #t] + [#:syntax-post-processor syntax-post-proc + (syntax? . -> . syntax?) + values]) readtable?]{ Constructs an @"@"-readtable. The keyword arguments can customize the @@ -934,9 +936,6 @@ resulting reader in several ways: [_else (error "@ forms must have a body")]))) ]} -@item{@scheme[start-inside?] --- if true, creates a readtable for -use starting in text mode, instead of S-expression mode.} - ]} @defproc[(use-at-readtable ...) void?]{