|
|
|
#lang racket/base
|
|
|
|
|
|
|
|
#|
|
|
|
|
Implements the pollen/mode metalanguage. Certain values are hardcoded inside the Racket source, so we have to copy & paste, a little.
|
|
|
|
|
|
|
|
Note that pollen/mode uses a hardcoded #\◊, as the command char, NOT (setup:command-char),
|
|
|
|
because importing `pollen/setup` will create a loading loop
|
|
|
|
if pollen/mode were used in "pollen.rkt" (which is a likely place to use it)
|
|
|
|
Intractable problem; unavoidable limitation.
|
|
|
|
|#
|
|
|
|
|
|
|
|
|
|
|
|
;; because the reader "boots" from `pollen/mode`,
|
|
|
|
;; Racket looks for the `language-info` submodule in `pollen/mode`
|
|
|
|
;; so we just re-export the default.
|
|
|
|
(module language-info racket/base
|
|
|
|
(require at-exp/lang/language-info)
|
|
|
|
(provide (all-from-out at-exp/lang/language-info)))
|
|
|
|
|
|
|
|
|
|
|
|
;; adapted from
|
|
|
|
;; https://github.com/racket/racket/blob/master/pkgs/at-exp-lib/at-exp/lang/reader.rkt
|
|
|
|
|
|
|
|
(module* reader racket/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 (wrap-reader p)
|
|
|
|
(λ args
|
|
|
|
(parameterize ([current-readtable (make-at-readtable #:datum-readtable 'dynamic
|
|
|
|
#:command-readtable 'dynamic
|
|
|
|
#:command-char #\◊)])
|
|
|
|
(apply p args))))
|
|
|
|
|
|
|
|
(define-values (at-read at-read-syntax at-get-info)
|
|
|
|
(make-meta-reader
|
|
|
|
'pollen/mode
|
|
|
|
"language path"
|
|
|
|
(λ (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
|
|
|
|
(λ (orig-read-syntax)
|
|
|
|
(define read-syntax (wrap-reader orig-read-syntax))
|
|
|
|
(λ args
|
|
|
|
(define stx (apply read-syntax args))
|
|
|
|
(define old-prop (syntax-property stx 'module-language))
|
|
|
|
(define new-prop `#(at-exp/lang/language-info get-language-info ,old-prop))
|
|
|
|
(syntax-property stx 'module-language new-prop)))
|
|
|
|
(λ (proc)
|
|
|
|
(λ (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)
|
|
|
|
(define lexer-maker (dynamic-require 'syntax-color/scribble-lexer 'make-scribble-lexer (λ () #f)))
|
|
|
|
(if lexer-maker
|
|
|
|
(lexer-maker #:command-char #\◊)
|
|
|
|
(fallback))]
|
|
|
|
[(drracket:indentation)
|
|
|
|
(dynamic-require 'pollen/private/external/mode-indentation 'determine-spaces)]
|
|
|
|
[else (fallback)]))))))
|