racket/collects/errortrace/lang/reader.rkt
2010-10-05 09:18:46 -04:00

31 lines
1002 B
Racket

(module reader racket/base
(require syntax/module-reader)
(provide (rename-out [et-read read]
[et-read-syntax read-syntax]
[et-get-info get-info]))
(define (wrap-reader p)
(lambda args
(let ([r (apply p args)])
;; Re-write module to use `errortrace':
(if (syntax? r)
(syntax-case r ()
[(mod name lang . body)
(quasisyntax/loc r
(mod name errortrace/lang/body (#,(datum->syntax #f '#%module-begin) lang . body)))])
`(,(car r) ,(cadr r) errortrace/lang/body (#%module-begin . ,(cddr r)))))))
(define-values (et-read et-read-syntax et-get-info)
(make-meta-reader
'errortrace
"language path"
(lambda (str)
(let ([s (string->symbol
(string-append (bytes->string/latin-1 str)
"/lang/reader"))])
(and (module-path? s) s)))
wrap-reader
wrap-reader
values)))