From c8c23a1d39ae812f5130a53e5d68726d2dff199a Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Mon, 13 Jan 2020 13:45:24 -0800 Subject: [PATCH] preserve imperative changes to metas --- pollen/private/main-base.rkt | 13 ++++++++----- pollen/private/ts.rktd | 2 +- pollen/test/test-meta.rkt | 16 +++++++++++++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/pollen/private/main-base.rkt b/pollen/private/main-base.rkt index e46918a..03851b0 100644 --- a/pollen/private/main-base.rkt +++ b/pollen/private/main-base.rkt @@ -53,16 +53,19 @@ ;; and we want root to see those changes (begin0 (parse xs PARSER-MODE ROOT-ID) + ;; pick up any imperative changes to current-metas by tag functions + (set! METAS-ID-CALLER (current-metas)) + ;; restore previous value of metas (current-metas prev-metas))) (module METAS-ID racket/base (provide METAS-ID) (define METAS-ID META-HASH)) (require POLLEN/TOP (submod "." METAS-ID)) - (provide ALL-DEFINED-OUT ; implicitly picks up METAS-ID-CALLER + (provide ALL-DEFINED-OUT; implicitly picks up METAS-ID-CALLER DOC-ID) - (define prev-metas (current-metas)) - (define METAS-ID-CALLER METAS-ID) - (and (current-metas METAS-ID) "") ; because empty strings get stripped, voids don't ;; we set current-metas imperatively rather than using `splicing-parameterize` - ;; so that we can unset it in the post processor, rather than out here + ;; so that we can restore it in the post-processor, rather than out here + (define METAS-ID-CALLER METAS-ID) ; grab the new metas + (define prev-metas (current-metas)) ; stash the old metas + (and (current-metas METAS-ID-CALLER) "") ; because empty strings get stripped, voids don't (begin . EXPRS)))])) diff --git a/pollen/private/ts.rktd b/pollen/private/ts.rktd index 24ce079..b34acae 100644 --- a/pollen/private/ts.rktd +++ b/pollen/private/ts.rktd @@ -1 +1 @@ -1578891880 +1578951924 diff --git a/pollen/test/test-meta.rkt b/pollen/test/test-meta.rkt index 81fc633..ce58dba 100644 --- a/pollen/test/test-meta.rkt +++ b/pollen/test/test-meta.rkt @@ -7,4 +7,18 @@ (provide val)) (require rackunit 'metatest) -(check-equal? val "value") \ No newline at end of file +(check-equal? val "value") + +;; check that exported metas are a copy of final state of current-metas +(module metatest2 pollen + (define-meta key "value") + (define (tag . xs) + (current-metas (hash-set (current-metas) 'key "reset")) + "") + (tag "hello") + (define val (hash-ref metas 'key)) + (provide val)) + +(require (prefix-in 2: 'metatest2)) +(check-equal? val "value") +(check-equal? (hash-ref 2:metas 'key) "reset") \ No newline at end of file