From 51598299301a8285902f51101a1b35c9954ebb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Mon, 22 Aug 2016 20:12:30 +0200 Subject: [PATCH 1/2] Added require and provide transformers expander-in and expander-out --- main.rkt | 1 + main.scrbl | 1 + private/reqprov.rkt | 35 +++++++++++++++++++++++++++++++++++ private/reqprov.scrbl | 26 ++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 private/reqprov.rkt create mode 100644 private/reqprov.scrbl diff --git a/main.rkt b/main.rkt index 9b0fa62..85bea82 100644 --- a/main.rkt +++ b/main.rkt @@ -4,3 +4,4 @@ "private/define-expanders.rkt" "private/scoped-transformers.rkt" "private/define-scoped-transformers.rkt" +"private/reqprov.rkt" \ No newline at end of file diff --git a/main.scrbl b/main.scrbl index c98b87f..1c4d925 100644 --- a/main.scrbl +++ b/main.scrbl @@ -25,3 +25,4 @@ extensible. @include-section["private/define-expanders.scrbl"] @include-section["private/scoped-transformers.scrbl"] @include-section["private/define-scoped-transformers.scrbl"] +@include-section["private/reqprov.scrbl"] diff --git a/private/reqprov.rkt b/private/reqprov.rkt new file mode 100644 index 0000000..8d70f6b --- /dev/null +++ b/private/reqprov.rkt @@ -0,0 +1,35 @@ +#lang racket/base + +(require racket/require-syntax + racket/provide-syntax + (for-syntax racket/base + racket/provide-transform + racket/syntax)) + +(provide expander-in + expander-out) + +(define-for-syntax (reqprov-transformer2 id combiner prefix) + (with-syntax + ([id-expander-type (format-id id "~a-expander-type" id)] + [make-id-expander (format-id id "make-~a-expander" id)] + [id-expander? (format-id id "~a-expander?" id)] + [define-id-expander (format-id id "define-~a-expander" id)] + [expand-all-id-expanders (format-id id "expand-all-~a-expanders" id)]) + #`(#,combiner (for-syntax (#,@prefix id-expander-type)) + (for-syntax (#,@prefix make-id-expander)) + (for-syntax (#,@prefix id-expander?)) + (#,@prefix define-id-expander) + (for-syntax (#,@prefix expand-all-id-expanders))))) + +(define-require-syntax (expander-in stx) + (syntax-case stx () + [(_ id modpath) + (identifier? #'id) + (reqprov-transformer2 #'id #'combine-in #'(only-in modpath))])) + +(define-provide-syntax (expander-out stx) + (syntax-case stx () + [(_ id) + (identifier? #'id) + (reqprov-transformer2 #'id #'combine-out #'(combine-out))])) \ No newline at end of file diff --git a/private/reqprov.scrbl b/private/reqprov.scrbl new file mode 100644 index 0000000..997ad6e --- /dev/null +++ b/private/reqprov.scrbl @@ -0,0 +1,26 @@ +#lang scribble/manual +@(require "doc-util.rkt") + +@title{@racket[require] and @racket[provide] transformers} + +@defform[#:kind "require transformer" + (expander-in id)]{ + This @techlink[#:doc '(lib "scribblings/reference/reference.scrbl")]{ + require transformer} imports the identifiers defined by + @racket[(define-expander-type id)]: + @itemlist[@item{@tt{@emph{id}-expander-type}} + @item{@tt{make-@emph{id}-expander}} + @item{@tt{@emph{id}-expander?}} + @item{@tt{define-@emph{id}-expander}} + @item{@tt{expand-all-@emph{id}-expanders}}]} + +@defform[#:kind "provide transformer" + (expander-out id)]{ + This @techlink[#:doc '(lib "scribblings/reference/reference.scrbl")]{ + provide transformer} exports the identifiers defined by + @racket[(define-expander-type id)]: + @itemlist[@item{@tt{@emph{id}-expander-type}} + @item{@tt{make-@emph{id}-expander}} + @item{@tt{@emph{id}-expander?}} + @item{@tt{define-@emph{id}-expander}} + @item{@tt{expand-all-@emph{id}-expanders}}]} \ No newline at end of file From 50cac9ec150a00089fec2dcf23d540552bd1c64b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Tue, 23 Aug 2016 13:50:27 +0200 Subject: [PATCH 2/2] Use syntax/parse for reqprov, fix documentation for require-in and change order of arguments for require-in. --- private/reqprov.rkt | 19 +++++++++---------- private/reqprov.scrbl | 5 +++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/private/reqprov.rkt b/private/reqprov.rkt index 8d70f6b..42f3572 100644 --- a/private/reqprov.rkt +++ b/private/reqprov.rkt @@ -4,7 +4,8 @@ racket/provide-syntax (for-syntax racket/base racket/provide-transform - racket/syntax)) + racket/syntax + syntax/parse)) (provide expander-in expander-out) @@ -22,14 +23,12 @@ (#,@prefix define-id-expander) (for-syntax (#,@prefix expand-all-id-expanders))))) -(define-require-syntax (expander-in stx) - (syntax-case stx () - [(_ id modpath) - (identifier? #'id) - (reqprov-transformer2 #'id #'combine-in #'(only-in modpath))])) +(define-require-syntax expander-in + (syntax-parser + [(_ require-spec id:id) + (reqprov-transformer2 #'id #'combine-in #'(only-in require-spec))])) -(define-provide-syntax (expander-out stx) - (syntax-case stx () - [(_ id) - (identifier? #'id) +(define-provide-syntax expander-out + (syntax-parser + [(_ id:id) (reqprov-transformer2 #'id #'combine-out #'(combine-out))])) \ No newline at end of file diff --git a/private/reqprov.scrbl b/private/reqprov.scrbl index 997ad6e..2478da3 100644 --- a/private/reqprov.scrbl +++ b/private/reqprov.scrbl @@ -4,9 +4,10 @@ @title{@racket[require] and @racket[provide] transformers} @defform[#:kind "require transformer" - (expander-in id)]{ + (expander-in require-spec id)]{ This @techlink[#:doc '(lib "scribblings/reference/reference.scrbl")]{ - require transformer} imports the identifiers defined by + require transformer} imports from @racket[require-spec] + the identifiers defined by @racket[(define-expander-type id)]: @itemlist[@item{@tt{@emph{id}-expander-type}} @item{@tt{make-@emph{id}-expander}}