35 lines
1.1 KiB
Scheme
35 lines
1.1 KiB
Scheme
(module htdp-reader mzscheme
|
|
(require (lib "etc.ss"))
|
|
(provide make-read-syntax
|
|
make-read)
|
|
|
|
(define (make-read spec)
|
|
(let ([read
|
|
(opt-lambda ([port (current-input-port)])
|
|
(syntax-object->datum ((make-read-syntax spec) 'whatever port)))])
|
|
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))]))))
|
|
|
|
(define (lookup key table)
|
|
(let ([ans (assoc key table)])
|
|
(unless ans
|
|
(error 'special-reader "couldn't find ~s in table ~s"
|
|
key table))
|
|
(cadr ans)))
|
|
|
|
(define (make-read-syntax spec)
|
|
(let ([read-syntax
|
|
(opt-lambda ([source-name #f]
|
|
[port (current-input-port)])
|
|
(let ([table (read port)])
|
|
`(module ,(lookup 'modname table) ,spec
|
|
,@(parameterize ([read-case-sensitive (lookup 'read-case-sensitive table)])
|
|
(get-all-exps source-name port)))))])
|
|
read-syntax)))
|