* Reorganize the -inside readers in the scribble reader

* #:start-inside? is gone -- it never made sense
* Instead, there's a new `make-at-reader/inside' (with the same
  arguments) that returns an inside syntax reader.

svn: r15073
This commit is contained in:
Eli Barzilay 2009-06-04 03:51:22 +00:00
parent e96941407c
commit 2be3ac0178
3 changed files with 58 additions and 64 deletions

View File

@ -701,8 +701,6 @@ resulting reader in several ways.
#'cmd)]) #'cmd)])
(syntax/loc stx (mk-cmd rest ...)))])) (syntax/loc stx (mk-cmd rest ...)))]))
* #:start-inside? -- used internally by the above `-inside' variants.
> (use-at-readtable [keyword-args]) > (use-at-readtable [keyword-args])
Installs the Scribble readtable as the default. Useful for REPL Installs the Scribble readtable as the default. Useful for REPL

View File

@ -506,17 +506,26 @@
;; ---------------------------------------------------------------------------- ;; ----------------------------------------------------------------------------
;; readtable ;; readtable
(provide make-at-readtable) (provide make-at-readtable make-at-reader/inside)
(define (make-at-readtable
#:readtable [readtable (current-readtable)] (define default-src (gensym 'scribble-reader))
#:command-char [command-char ch:command] (define (src-name src port)
#:start-inside? [start-inside? #f] (if (eq? src default-src) (object-name port) src))
#:datum-readtable [datum-readtable #t]
#:syntax-post-processor [syntax-post-processor values]) (define ((make-at-readtable-or-inside-reader inside-reader?)
readtable command-char datum-readtable syntax-post-processor)
(define dispatcher (define dispatcher
(make-dispatcher start-inside? command-char (make-dispatcher #f command-char (lambda () cmd-rt) (lambda () datum-rt)
(lambda () cmd-rt) (lambda () datum-rt)
syntax-post-processor)) 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 (define at-rt
(make-readtable readtable command-char 'non-terminating-macro dispatcher)) (make-readtable readtable command-char 'non-terminating-macro dispatcher))
(define cmd-rt (define cmd-rt
@ -544,7 +553,23 @@
[(procedure? datum-readtable) (datum-readtable at-rt)] [(procedure? datum-readtable) (datum-readtable at-rt)]
[else (error 'make-at-readtable [else (error 'make-at-readtable
"bad datum-readtable: ~e" datum-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) (provide use-at-readtable)
(define use-at-readtable (define use-at-readtable
@ -556,51 +581,23 @@
;; utilities for below ;; utilities for below
(define make-default-at-readtable (define make-default-at-readtable
(readtable-cached (readtable-cached (lambda (rt) (make-at-readtable #:readtable rt))))
(lambda (rt) (make-at-readtable #:readtable rt)))) (define make-default-at-reader/inside
(define make-default-at-dispatcher/inside (readtable-cached (lambda (rt) (make-at-reader/inside #:readtable rt))))
(readtable-cached
(lambda (rt)
(let-values ([(_1 disp _2)
(readtable-mapping
(make-at-readtable #:readtable rt #:start-inside? #t)
ch:command)])
disp))))
;; ---------------------------------------------------------------------------- ;; ----------------------------------------------------------------------------
;; readers ;; readers
(define default-src (gensym 'scribble-reader)) (provide (rename-out [*read read] [*read-syntax read-syntax]))
(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 ...)]))
(define (*read [inp (current-input-port)]) (define (*read [inp (current-input-port)])
(with-at-reader (read inp))) (parameterize ([current-readtable (make-default-at-readtable)])
(read inp)))
(define (*read-syntax [src default-src] (define (*read-syntax [src default-src] [inp (current-input-port)])
[inp (current-input-port)]) (parameterize ([current-readtable (make-default-at-readtable)])
(with-at-reader (read-syntax (src-name src inp) inp))) (read-syntax (src-name src inp) inp)))
(provide read-inside read-syntax-inside)
(define (read-inside [inp (current-input-port)]) (define (read-inside [inp (current-input-port)])
(let*-values ([(line col pos) (port-next-location inp)] (syntax->datum ((make-default-at-reader/inside) default-src inp)))
[(inside-dispatcher) (make-default-at-dispatcher/inside)]) (define (read-syntax-inside [src default-src] [inp (current-input-port)])
(with-at-reader ((make-default-at-reader/inside) src inp))
(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)

View File

@ -891,14 +891,16 @@ Useful for implementing languages that are textual by default (see
@filepath{docreader.ss} for example). @filepath{docreader.ss} for example).
} }
@defproc[(make-at-readtable [#:readtable readtable readtable? (current-readtable)] @defproc[(make-at-readtable
[#:readtable readtable readtable? (current-readtable)]
[#:command-char command-char character? #\@] [#:command-char command-char character? #\@]
[#:start-inside? start-inside? any/c #f]
[#:datum-readtable datum-readtable [#:datum-readtable datum-readtable
(or/c readtable? boolean? (or/c readtable? boolean?
(readtable? . -> . readtable?)) (readtable? . -> . readtable?))
#t] #t]
[#:syntax-post-processor syntax-post-proc (syntax? . -> . syntax?) values]) [#:syntax-post-processor syntax-post-proc
(syntax? . -> . syntax?)
values])
readtable?]{ readtable?]{
Constructs an @"@"-readtable. The keyword arguments can customize the 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")]))) [_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?]{ @defproc[(use-at-readtable ...) void?]{