#lang racket/base
(require racket/provide racket/list racket/string racket/format racket/match racket/port racket/function racket/provide
         br/define br/syntax br/datum br/debug br/cond br/list br/reader-utils br/module racket/class racket/vector racket/promise
         (for-syntax racket/base racket/syntax br/syntax br/debug br/define br/datum))
(provide (all-from-out racket/base)
         (all-from-out racket/list racket/string racket/format racket/match racket/port racket/function racket/provide
                       br/syntax br/datum br/debug br/cond br/list br/reader-utils br/module racket/class racket/vector racket/promise br/define)
         (for-syntax (all-from-out racket/base racket/syntax br/syntax br/debug br/datum))
         (for-syntax caller-stx with-shared-id)) ; from br/define
         
(provide evaluate)
(define-macro (evaluate DATUM)
  #'(begin
      (define-namespace-anchor nsa)
      (eval DATUM (namespace-anchor->namespace nsa))))

(provide really-dynamic-require)
(define-macro (really-dynamic-require . ARGS)
  #'(parameterize ([current-namespace (make-base-namespace)])
      (dynamic-require . ARGS)))

(module reader racket/base
  (provide (rename-out
            [br-read read]
            [br-read-syntax read-syntax]
            [brr-mod:get-info get-info]))

  (module br-reader syntax/module-reader
    #:language 'br
    #:info br-get-info
    #:read my-read
    #:read-syntax my-read-syntax
    (require br/get-info (prefix-in at: scribble/reader))
    (define (my-read ip) (syntax->datum (my-read-syntax ip)))
    (define (my-read-syntax src ip)
      (parameterize ([current-readtable (at:make-at-readtable #:command-char #\◊)])
        (read-syntax src ip))))

  (require debug/reader (prefix-in brr-mod: 'br-reader))

  #|
Use wrap-reader on the whole-module read function that would be exported
by the reader module, not the single-expression read function like
at:read-syntax that you deal with within syntax/module-reader or normal use.
|#

  (define br-read (wrap-reader brr-mod:read))
  (define br-read-syntax (wrap-reader brr-mod:read-syntax)))