racket-udelim/udelim/lang/reader.rkt

68 lines
2.2 KiB
Racket
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(module reader racket/base
(require syntax/module-reader
udelim
)
(provide (rename-out [at-read read]
[at-read-syntax read-syntax]
[at-get-info get-info]))
(define udelim-table
(make-list-delim-readtable/wrap
#\🌜 #\🌛 '#%moon-faces
#:base-readtable
(make-list-delim-readtable/wrap
#\⦕ #\⦖ '#%double-inequality-brackets
#:base-readtable
(make-list-delim-readtable/wrap
#\⦓ #\⦔ '#%inequality-brackets
#:base-readtable
(make-list-delim-readtable/wrap
#\ #\﴿ '#%ornate-parens
#:base-readtable
(make-list-delim-readtable/wrap
#\⸨ #\⸩ '#%double-parens
#:base-readtable
(make-string-delim-readtable/wrap
#\「 #\」 '#%cjk-corner-quotes
#:base-readtable
(make-string-delim-readtable #\« #\»))))))))
(define (wrap-reader p)
(lambda args
(parameterize ([current-readtable udelim-table])
(apply p args))))
(define-values (at-read at-read-syntax at-get-info)
(make-meta-reader
'udelim
"language path"
;lang-reader-module-paths
(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) proc)
#;(lambda (proc)
(lambda (key defval)
(define (fallback) (if proc (proc key defval) defval))
(define (try-dynamic-require mod export)
(or (with-handlers ([exn:fail? (λ (x) #f)])
(dynamic-require mod export))
(fallback)))
(case key
[(color-lexer)
(try-dynamic-require 'syntax-color/scribble-lexer 'scribble-lexer)]
[(definitions-text-surrogate)
'scribble/private/indentation]
[(drracket:indentation)
(dynamic-require 'scribble/private/indentation 'determine-spaces)]
[else (fallback)]))))))