* 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)])
|
||||
(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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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?]{
|
||||
|
|
Loading…
Reference in New Issue
Block a user