racket/collects/at-exp/lang/reader.rkt
2012-03-09 10:34:56 -07:00

37 lines
1.1 KiB
Racket

(module reader scheme/base
(require syntax/module-reader
(only-in scribble/reader make-at-readtable))
(provide (rename-out [at-read read]
[at-read-syntax read-syntax]
[at-get-info get-info]))
(define at-readtable (make-at-readtable))
(define (wrap-reader p)
(lambda args
(parameterize ([current-readtable at-readtable])
(apply p args))))
(define-values (at-read at-read-syntax at-get-info)
(make-meta-reader
'at-exp
"language path"
(lambda (bstr)
(let* ([str (bytes->string/latin-1 bstr)]
[sym (string->symbol str)])
(and (module-path? sym)
(vector
;; try submod first:
`(submod ,sym reader)
;; fall back to /lang/reader:
(string->symbol (string-append str "/lang/reader"))))))
wrap-reader
wrap-reader
(lambda (proc)
(lambda (key defval)
(case key
[(color-lexer)
(dynamic-require 'syntax-color/scribble-lexer 'scribble-lexer)]
[else (if proc (proc key defval) defval)]))))))