From e311d4e362d2118e38f6e34695b58310fcd61f0c Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Wed, 23 Jul 2014 12:17:24 -0700 Subject: [PATCH] make exports visible as top-level identifiers in REPL --- main-base.rkt | 33 ++++++++---------------------- reader-base.rkt | 54 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/main-base.rkt b/main-base.rkt index 71113be..fdfbb51 100644 --- a/main-base.rkt +++ b/main-base.rkt @@ -34,25 +34,14 @@ (require 'inner) - ;; if reader-here-path is undefined, it will become a proc courtesy of #%top - ;; therefore that's how we can detect if it's undefined - (define here-path (if (procedure? inner:reader-here-path) "anonymous-module" inner:reader-here-path)) - - - ;; set the parser mode based on reader mode - ;; todo: this won't work with inline submodules + ;; in an inline module, reader-here-path and parser-mode are undefined + ;; (because there's no reader) + ;; but they'll become tag functions courtesy of #%top + ;; so that's how we can detect if they are undefined + (define here-path + (if (procedure? inner:reader-here-path) "anonymous-module" inner:reader-here-path)) (define parser-mode - (if (not (procedure? inner:reader-mode)) - (if (equal? inner:reader-mode world:mode-auto) - (let* ([file-ext-pattern (pregexp "\\w+$")] - [here-ext (string->symbol (car (regexp-match file-ext-pattern here-path)))]) - (cond - [(equal? here-ext world:pagetree-source-ext) world:mode-pagetree] - [(equal? here-ext world:markup-source-ext) world:mode-markup] - [(equal? here-ext world:markdown-source-ext) world:mode-markdown] - [else world:mode-preproc])) - inner:reader-mode) - mode-arg)) + (if (procedure? inner:parser-mode) mode-arg inner:parser-mode)) ;; Split out the metas. @@ -106,10 +95,4 @@ (provide metas doc ;; hide the exports that were only for internal use. - (except-out (all-from-out 'inner) doc-raw #%top)) - - ;; for output in DrRacket - (module+ main - (if (or (equal? parser-mode world:mode-preproc) (equal? parser-mode world:mode-template)) - (display doc) - (print doc)))))]))))])) \ No newline at end of file + (except-out (all-from-out 'inner) doc-raw #%top))))]))))])) \ No newline at end of file diff --git a/reader-base.rkt b/reader-base.rkt index 490a74d..02a169d 100644 --- a/reader-base.rkt +++ b/reader-base.rkt @@ -14,28 +14,46 @@ (λ (path-string p) (define read-inner (make-at-reader #:command-char (if (or (equal? reader-mode world:mode-template) - (and (string? path-string) (regexp-match (pregexp (format "\\.~a$" world:template-source-ext)) path-string))) - world:template-command-marker - world:command-marker) + (and (string? path-string) (regexp-match (pregexp (format "\\.~a$" world:template-source-ext)) path-string))) + world:template-command-marker + world:command-marker) #:syntax? #t #:inside? #t)) (define file-contents (read-inner path-string p)) (datum->syntax file-contents - `(module pollen-lang-module pollen - (define reader-mode ',reader-mode) - (define reader-here-path ,(cond - [(symbol? path-string) (symbol->string path-string)] - [(equal? path-string "unsaved editor") path-string] - [else (path->string path-string)])) - ;; change the name of reader-here-path & reader-mode for local use - ;; so they don't conflict if this source is imported into another - (provide (except-out (all-defined-out) reader-here-path reader-mode) - (prefix-out inner: reader-here-path) - (prefix-out inner: reader-mode)) - - ,(require+provide-project-require-files path-string) - ,@file-contents) - file-contents))) + `(module repl-wrapper racket/base + (module pollen-lang-module pollen + (define reader-mode ',reader-mode) + (define reader-here-path ,(cond + [(symbol? path-string) (symbol->string path-string)] + [(equal? path-string "unsaved editor") path-string] + [else (path->string path-string)])) + (define parser-mode + (if (equal? reader-mode world:mode-auto) + (let* ([file-ext-pattern (pregexp "\\w+$")] + [here-ext (string->symbol (car (regexp-match file-ext-pattern reader-here-path)))]) + (cond + [(equal? here-ext world:pagetree-source-ext) world:mode-pagetree] + [(equal? here-ext world:markup-source-ext) world:mode-markup] + [(equal? here-ext world:markdown-source-ext) world:mode-markdown] + [else world:mode-preproc])) + reader-mode)) + ;; change names of exports for local use + ;; so they don't conflict if this source is imported into another + (provide (except-out (all-defined-out) reader-here-path reader-mode parser-mode) + (prefix-out inner: reader-here-path) + (prefix-out inner: reader-mode) + (prefix-out inner: parser-mode)) + + ,(require+provide-project-require-files path-string) + ,@file-contents) + (require 'pollen-lang-module) + (provide (all-from-out 'pollen-lang-module)) + (module+ main + (if (or (equal? inner:parser-mode world:mode-preproc) (equal? inner:parser-mode world:mode-template)) + (display doc) + (print doc)))) + file-contents))) (define-syntax-rule (define+provide-reader-in-mode mode)