From 69d9c168b61e25ee1e4f766cb181a4dea46a5bb7 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Wed, 28 Feb 2018 14:28:06 -0800 Subject: [PATCH] tidier patch --- pollen/main.rkt | 2 +- pollen/markdown.rkt | 2 +- pollen/markup.rkt | 2 +- pollen/pre.rkt | 2 +- pollen/private/dialect.rkt | 12 ++++++++++++ pollen/private/main-base.rkt | 29 ++++------------------------- pollen/private/reader-base.rkt | 34 +++++++++++++++------------------- pollen/ptree.rkt | 2 +- 8 files changed, 36 insertions(+), 49 deletions(-) create mode 100644 pollen/private/dialect.rkt diff --git a/pollen/main.rkt b/pollen/main.rkt index 0c4ce9d..3a6117c 100644 --- a/pollen/main.rkt +++ b/pollen/main.rkt @@ -1,4 +1,4 @@ -#lang s-exp "private/main-base.rkt" +#lang s-exp pollen/private/dialect default-mode-preproc (module reader "private/reader-base.rkt" diff --git a/pollen/markdown.rkt b/pollen/markdown.rkt index c326617..c2f7370 100644 --- a/pollen/markdown.rkt +++ b/pollen/markdown.rkt @@ -1,4 +1,4 @@ -#lang s-exp "private/main-base.rkt" +#lang s-exp pollen/private/dialect default-mode-markdown (module reader "private/reader-base.rkt" diff --git a/pollen/markup.rkt b/pollen/markup.rkt index 1fb3cae..6fd9f54 100644 --- a/pollen/markup.rkt +++ b/pollen/markup.rkt @@ -1,4 +1,4 @@ -#lang s-exp "private/main-base.rkt" +#lang s-exp pollen/private/dialect default-mode-markup (module reader "private/reader-base.rkt" diff --git a/pollen/pre.rkt b/pollen/pre.rkt index 5ec7ed2..92c94be 100644 --- a/pollen/pre.rkt +++ b/pollen/pre.rkt @@ -1,4 +1,4 @@ -#lang s-exp "private/main-base.rkt" +#lang s-exp pollen/private/dialect default-mode-preproc (module reader "private/reader-base.rkt" diff --git a/pollen/private/dialect.rkt b/pollen/private/dialect.rkt new file mode 100644 index 0000000..3231c85 --- /dev/null +++ b/pollen/private/dialect.rkt @@ -0,0 +1,12 @@ +#lang racket/base +(require pollen/setup) +(provide (except-out (all-from-out racket/base pollen/setup) #%module-begin) + (rename-out [mb #%module-begin]) #%top-interaction) + +(define-syntax-rule (mb mode . args) + (#%module-begin + (require (prefix-in p: "private/main-base.rkt")) + (provide (rename-out [mb #%module-begin])) + (define-syntax-rule (mb . other-args) + (p:#%module-begin mode . other-args)) + . args)) \ No newline at end of file diff --git a/pollen/private/main-base.rkt b/pollen/private/main-base.rkt index bb07bef..e2292ef 100644 --- a/pollen/private/main-base.rkt +++ b/pollen/private/main-base.rkt @@ -1,26 +1,9 @@ #lang racket/base -(require (for-syntax racket/base racket/syntax syntax/strip-context "../setup.rkt" "split-metas.rkt") +(require (for-syntax racket/base syntax/strip-context "../setup.rkt" "split-metas.rkt") "to-string.rkt" "../pagetree.rkt" "splice.rkt" "../setup.rkt" "../core.rkt" (prefix-in doclang: "doclang-raw.rkt")) (provide (except-out (all-from-out racket/base) #%module-begin) - (rename-out [dialect-module-begin #%module-begin])) - -;; PARSER-MODE-FROM-READER is used when Pollen is invoked as a specific dialect #lang, and the expander is the generic `pollen/main`. -;; PARSER-MODE-FROM-EXPANDER is used when Pollen is invoked through an inline submodule, -;; and the expander is a specific dialect: `pollen/markup`, `pollen/pre`, etc. -;; they only differ in the `pollen/main` dialect, where the reader infers the dialect from the file extension. - -(define-syntax-rule (dialect-module-begin PARSER-MODE-FROM-EXPANDER READER-SUBMOD) - (#%module-begin - (require racket/base) - (provide (except-out (all-from-out racket/base) #%module-begin) - (rename-out [pmb #%module-begin])) - (define-syntax (pmb stx) - (syntax-case stx () - [(_ . EXPRS) (with-syntax ([EXPRS (syntax-property #'EXPRS 'parser-mode-from-expander 'PARSER-MODE-FROM-EXPANDER)]) - #'(pollen-module-begin . EXPRS))])) - READER-SUBMOD)) - + (rename-out [pollen-module-begin #%module-begin])) (define (make-parse-proc parser-mode root-proc) (define (stringify xs) (apply string-append (map to-string xs))) @@ -40,14 +23,11 @@ (or (memf (λ (ln) (and (not (equal? ln (setup:newline))) (not (equal? ln "")))) doc) null)) - (define-syntax (pollen-module-begin stx) (syntax-case stx () - [(_ . EXPRS) + [(_ PARSER-MODE . EXPRS) (with-syntax (;; 'parser-mode-from-reader will be #f for an inline submodule [EXPRS (replace-context #'here #'EXPRS)] - [PARSER-MODE-FROM-READER (syntax-property stx 'parser-mode-from-reader)] - [PARSER-MODE-FROM-EXPANDER (syntax-property #'EXPRS 'parser-mode-from-expander)] [META-HASH (split-metas #'EXPRS (setup:define-meta-name))] [METAS-ID (setup:meta-export)] [META-MOD-ID (setup:meta-export)] @@ -56,8 +36,7 @@ #'(doclang:#%module-begin DOC-ID ; positional arg for doclang-raw: name of export (λ (xs) - (define parser-mode (or 'PARSER-MODE-FROM-READER PARSER-MODE-FROM-EXPANDER)) - (define proc (make-parse-proc parser-mode ROOT-ID)) + (define proc (make-parse-proc PARSER-MODE ROOT-ID)) (define doc-elements (splice (strip-leading-newlines xs) (setup:splicing-tag))) (proc doc-elements)) ; positional arg for doclang-raw: post-processor (module META-MOD-ID racket/base diff --git a/pollen/private/reader-base.rkt b/pollen/private/reader-base.rkt index 42a0d93..57d1fdb 100644 --- a/pollen/private/reader-base.rkt +++ b/pollen/private/reader-base.rkt @@ -22,6 +22,10 @@ auto-computed-mode) reader-mode)) +(define (derive-expander-name mode) + (define suffix (if (eq? mode default-mode-auto) "" mode)) + (string->symbol (format "pollen/~a" suffix))) + (define (custom-read p) (syntax->datum (custom-read-syntax (object-name p) p))) @@ -36,36 +40,28 @@ (define parser-mode-from-reader (infer-parser-mode reader-mode reader-here-path)) (strip-context (with-syntax* ([POLLEN-MOD-NAME 'pollen-module] - ;; these exist only in the reader because they are specific to file-based Pollen sources. + ;; the next two exist only in the reader because they are specific to file-based Pollen sources. ;; an inline Pollen submodule doesn't have "pollen.rkt" or `here-path` [POLLEN-REQUIRE-AND-PROVIDES (require+provide-directory-require-files path-string)] - [HERE-KEY (setup:here-path-key)] [HERE-PATH reader-here-path] + [HERE-KEY (setup:here-path-key)] [SOURCE-LINES source-stx] [DOC (setup:main-export)] [META-MOD (setup:meta-export)] - [PARSER-MODE-FROM-READER parser-mode-from-reader] - [EXPANDER (cond - [(eq? parser-mode-from-reader default-mode-markup) 'pollen/markup] - [(eq? parser-mode-from-reader default-mode-markdown) 'pollen/markdown] - [(eq? parser-mode-from-reader default-mode-pagetree) 'pollen/ptree] - [(eq? parser-mode-from-reader default-mode-preproc) 'pollen/pre] - [(eq? parser-mode-from-reader default-mode-auto) 'pollen] - [(eq? parser-mode-from-reader default-mode-template) 'pollen/template] - [else 'pollen])] - [POLLEN-MODULE-SYNTAX (let ([mod-stx #'(module POLLEN-MOD-NAME EXPANDER - (define-meta HERE-KEY HERE-PATH) - POLLEN-REQUIRE-AND-PROVIDES - . SOURCE-LINES)]) - (syntax-property mod-stx 'parser-mode-from-reader parser-mode-from-reader))]) + [METAS-ID (setup:meta-export)] + [PARSER-MODE-FROM-READER parser-mode-from-reader]) #'(module runtime-wrapper racket/base (module configure-runtime racket/base (require pollen/private/runtime-config) (configure HERE-PATH)) ; HERE-PATH acts as "top" runtime config when module is main - POLLEN-MODULE-SYNTAX + (module POLLEN-MOD-NAME pollen/private/main-base + 'PARSER-MODE-FROM-READER + (define-meta HERE-KEY HERE-PATH) + POLLEN-REQUIRE-AND-PROVIDES + . SOURCE-LINES) (module META-MOD racket/base (require (submod ".." POLLEN-MOD-NAME META-MOD)) - (provide (all-from-out (submod ".." POLLEN-MOD-NAME META-MOD)))) + (provide METAS-ID)) (require (only-in pollen/private/runtime-config show) 'POLLEN-MOD-NAME) (provide (all-from-out 'POLLEN-MOD-NAME)) (show DOC 'PARSER-MODE-FROM-READER HERE-PATH))))) ; HERE-PATH otherwise acts as "local" runtime config @@ -98,7 +94,7 @@ (dynamic-require 'scribble/private/indentation 'determine-spaces)] [else default])))) -(define-syntax-rule (reader-module-begin mode expr-to-ignore ...) +(define-syntax-rule (reader-module-begin mode . _) (#%module-begin (define cgi custom-get-info) ; stash hygienic references to local funcs with macro-introduced identifiers (define cr custom-read) ; so they can be provided out diff --git a/pollen/ptree.rkt b/pollen/ptree.rkt index fa35516..84ffb84 100644 --- a/pollen/ptree.rkt +++ b/pollen/ptree.rkt @@ -1,4 +1,4 @@ -#lang s-exp "private/main-base.rkt" +#lang s-exp pollen/private/dialect default-mode-pagetree (module reader "private/reader-base.rkt"