From 122586f1300d4e3129faa09cbe5876f04646000f Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 4 Jun 2019 16:54:06 -0700 Subject: [PATCH] Rearrange lexical scoping (fixes #202) --- pollen/private/dialect.rkt | 14 ++++++++------ pollen/private/main-base.rkt | 26 +++++++++++++++----------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/pollen/private/dialect.rkt b/pollen/private/dialect.rkt index 3231c85..1446c63 100644 --- a/pollen/private/dialect.rkt +++ b/pollen/private/dialect.rkt @@ -3,10 +3,12 @@ (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) +(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 + (require (except-in "private/main-base.rkt" #%module-begin) + (prefix-in p: (only-in "private/main-base.rkt" #%module-begin))) + (provide (all-from-out "private/main-base.rkt") + (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 ba34524..0a6ab8d 100644 --- a/pollen/private/main-base.rkt +++ b/pollen/private/main-base.rkt @@ -8,11 +8,12 @@ "to-string.rkt" "../pagetree.rkt" "splice.rkt" - "../setup.rkt" "../core.rkt" + "../setup.rkt" (prefix-in doclang: "external/doclang-raw.rkt")) (provide (except-out (all-from-out racket/base) #%module-begin) - (rename-out [pollen-module-begin #%module-begin])) + (rename-out [pollen-module-begin #%module-begin]) + (all-from-out "../core.rkt" "../setup.rkt")) (define ((make-parse-proc parser-mode root-proc) xs) (define (stringify xs) (apply string-append (map to-string xs))) @@ -35,11 +36,13 @@ (define-syntax (pollen-module-begin stx) (syntax-case stx () [(_ PARSER-MODE . EXPRS) - (with-syntax ([EXPRS (replace-context #'here #'EXPRS)] - [META-HASH (split-metas #'EXPRS (setup:define-meta-name))] - [METAS-ID (setup:meta-export)] + (with-syntax ([META-HASH (split-metas #'EXPRS (setup:define-meta-name))] + [METAS-ID-HERE (setup:meta-export)] + [METAS-ID (datum->syntax #'EXPRS (setup:meta-export))] [META-MOD-ID (setup:meta-export)] - [ROOT-ID (setup:main-root-node)] + [ROOT-ID (datum->syntax #'EXPRS (setup:main-root-node))] + [CURRENT-METAS (datum->syntax #'EXPRS 'current-metas)] + [POLLEN/TOP (datum->syntax #'EXPRS 'pollen/top)] [DOC-ID (setup:main-export)]) #'(doclang:#%module-begin DOC-ID ; positional arg for doclang-raw: name of export @@ -47,14 +50,15 @@ (define proc (make-parse-proc PARSER-MODE ROOT-ID)) (define trimmed-xs (strip-leading-newlines xs)) (define doc-elements (splice trimmed-xs (setup:splicing-tag))) - (parameterize ([current-metas METAS-ID]) + (parameterize ([CURRENT-METAS METAS-ID]) (proc doc-elements))) ; positional arg for doclang-raw: post-processor (module META-MOD-ID racket/base (provide METAS-ID) (define METAS-ID META-HASH)) - (require pollen/top pollen/core pollen/setup (submod "." META-MOD-ID)) + (require POLLEN/TOP (submod "." META-MOD-ID)) (provide (all-defined-out) METAS-ID DOC-ID) - (define prev-metas (current-metas)) - (and (current-metas METAS-ID) "") ; because empty strings get stripped, voids don't + (define prev-metas (CURRENT-METAS)) + (define METAS-ID METAS-ID-HERE) + (and (CURRENT-METAS METAS-ID) "") ; because empty strings get stripped, voids don't (begin . EXPRS) - (and (current-metas prev-metas) "")))])) ; leave behind empty string, not void + (and (CURRENT-METAS prev-metas) "")))])) ; leave behind empty string, not void