* 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:
parent
e96941407c
commit
2be3ac0178
|
@ -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
|
||||||
|
|
|
@ -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)
|
|
||||||
|
|
|
@ -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?]{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user