From 532d21423c67254180e7f111e2ef85cc7214a6b0 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Wed, 26 Jun 2019 17:16:19 -0700 Subject: [PATCH] thinking --- brag-lib/brag/codegen/expander.rkt | 15 +++++++++++---- brag-lib/brag/codegen/proof-of-concept.rkt | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 brag-lib/brag/codegen/proof-of-concept.rkt diff --git a/brag-lib/brag/codegen/expander.rkt b/brag-lib/brag/codegen/expander.rkt index a6a759e..c246dd2 100755 --- a/brag-lib/brag/codegen/expander.rkt +++ b/brag-lib/brag/codegen/expander.rkt @@ -80,7 +80,8 @@ ;; the permissive tokenizer even nicer to work with. (cons eof token-EOF) (cons 'TOKEN-TYPE TOKEN-TYPE-CONSTRUCTOR) ...))) - + + (module mrp racket/base (define-syntax (MAKE-RULE-PARSER rule-id-stx) (syntax-case rule-id-stx () [(_ start-rule) @@ -89,7 +90,7 @@ ;; The cfg-parser depends on the start-rule provided in (start ...) to have the same ;; context as the rest of this body. Hence RECOLORED-START-RULE (with-syntax ([RECOLORED-START-RULE (datum->syntax #'RULES-STX (syntax-e #'start-rule))]) - #'(let ([THE-GRAMMAR (cfg-parser (tokens enumerated-tokens) + #`(let ([THE-GRAMMAR (cfg-parser (tokens enumerated-tokens) (src-pos) (start RECOLORED-START-RULE) (end EOF) @@ -115,11 +116,17 @@ [(_ not-a-rule-id) (raise-syntax-error #f (format "Rule ~a is not defined in the grammar" (syntax-e #'not-a-rule-id)) - rule-id-stx)])) + rule-id-stx)]))) + + (module RULE-ID racket/base + (require (submod ".." mrp)) + (define p (MAKE-RULE-PARSER RULE-ID)) + (provide p)) ... + (define PARSE-RULE-ID (procedure-rename - (let ([func-p (delay (MAKE-RULE-PARSER RULE-ID))]) + (let ([func-p (delay (dynamic-require '(submod #,(syntax-source rules-stx) RULE-ID) 'p))]) (λ args (apply (force func-p) args))) 'PARSE-RULE-ID)) ... (define (PARSE-RULE-ID-TO-DATUM x) diff --git a/brag-lib/brag/codegen/proof-of-concept.rkt b/brag-lib/brag/codegen/proof-of-concept.rkt new file mode 100644 index 0000000..fade87d --- /dev/null +++ b/brag-lib/brag/codegen/proof-of-concept.rkt @@ -0,0 +1,21 @@ +#lang racket + +(module mac racket + (provide m) + (println 'wasting-time) + (define-syntax-rule (m arg) arg)) + +(module mod racket + (require (submod ".." mac)) + (define (modm arg) (m arg)) + (provide modm)) + +(require rackunit) +(define f (let ([func-p (delay (dynamic-require '(submod "proof-of-concept.rkt" mod) 'modm))]) + (λ (x) ((force func-p) x)))) + +f +(f 100) +(f 100) + +