commit e117e4f919bf524040ff33c2854eec7fadb10567
parent 22053c0e0b8592e6f73ead6459aab632b351a40c
Author: Georges Dupéron <georges.duperon@gmail.com>
Date: Mon, 23 Jan 2017 19:55:26 +0100
Modified syntax-case & friends to use with-pvars. Closes 181 current-pvars: use in syntax-case, with-syntax, define/with-syntax, is there any with-parse?
Diffstat:
4 files changed, 49 insertions(+), 9 deletions(-)
diff --git a/case.rkt b/case.rkt
@@ -0,0 +1,10 @@
+(module case '#%kernel
+ (#%require "case/stxloc.rkt"
+ "case/syntax.rkt"
+ "case/with-stx.rkt")
+ (#%provide syntax-case
+ syntax-case*
+ define/with-syntax
+ with-syntax
+ datum-case
+ with-datum))
+\ No newline at end of file
diff --git a/case/stxcase.rkt b/case/stxcase.rkt
@@ -4,6 +4,7 @@
(module stxcase '#%kernel
(#%require racket/private/stx racket/private/small-scheme '#%paramz '#%unsafe
racket/private/ellipses
+ stxparse-info/current-pvars
(for-syntax racket/private/stx racket/private/small-scheme
racket/private/member racket/private/sc '#%kernel))
@@ -484,9 +485,13 @@
null
(if fender
(list (quote-syntax if) fender
- answer
+ (list (quote-syntax with-pvars)
+ pattern-vars
+ answer)
do-try-next)
- answer)))
+ (list (quote-syntax with-pvars)
+ pattern-vars
+ answer))))
do-try-next))])
(if fender
(list
diff --git a/case/syntax.rkt b/case/syntax.rkt
@@ -1,5 +1,6 @@
#lang racket/base
(require (only-in "stxloc.rkt" syntax-case)
+ stxparse-info/current-pvars
(for-syntax racket/base
racket/private/sc))
(provide define/with-syntax
@@ -45,7 +46,8 @@
(values (pvar-value pvar) ...)))
(define-syntax pvar
(make-syntax-mapping 'depth (quote-syntax valvar)))
- ...)))]))
+ ...
+ (define-pvars (pvar ...)))))]))
;; Ryan: alternative name: define/syntax-pattern ??
;; auxiliary macro
diff --git a/scribblings/stxparse-info.scrbl b/scribblings/stxparse-info.scrbl
@@ -19,12 +19,12 @@
Source code: @url{https://github.com/jsmaniac/stxparse-info}
-@defmodule[stxparse-info/parse]
+@defmodule[stxparse-info]
-The module @racketmodname[stxparse-info/parse] is a patched version of
-@racketmodname[syntax/parse] which tracks which syntax pattern variables are
-bound. This allows some libraries to change the way syntax pattern variables
-work.
+This library provides some patched versions of @racketmodname[syntax/parse]
+and the @racket[syntax-case] family. These patched versions track which syntax
+pattern variables are bound. This allows some libraries to change the way
+syntax pattern variables work.
For example, @racketmodname[phc-graph/subtemplate] automatically derives
temporary identifiers when a template contains @racket[yᵢ …], and @racket[xᵢ]
@@ -32,6 +32,23 @@ is a pattern variable. To know from which @racket[varᵢ] the @racket[yᵢ …]
identifiers must be derived, @racketmodname[phc-graph/subtemplate] needs to
know which syntax pattern variables are within scope.
+@section{Tracking currently-bound pattern variables with @racket[syntax-parse]}
+
+@defmodule[stxparse-info/parse]
+
+The module @racketmodname[stxparse-info/parse] provides patched versions of
+@racketmodname[syntax/parse] @racketmodname[define/syntax-parse] which track
+which syntax pattern variables are bound.
+
+@section{Tracking currently-bound pattern variables with @racket[syntax-parse]}
+
+@defmodule[stxparse-info/case]
+
+The module @racketmodname[stxparse-info/case] provides patched versions of
+@racket[syntax-case], @racket[syntax-case*], @racket[with-syntax],
+@racket[define/with-syntax], @racket[datum-case] and @racket[with-datum] which
+track which syntax or datum pattern variables are bound.
+
@section{Reading and updating the list of currently-bound pattern variables}
@defmodule[stxparse-info/current-pvars]
@@ -40,7 +57,12 @@ know which syntax pattern variables are within scope.
(current-pvars) (listof identifier?)]{
This for-syntax procedure returns the list of syntax pattern variables which
are known to be bound. The most recently bound variables are at the beginning
- of the list.}
+ of the list.
+
+ It is the responsibility of the reader to check that the identifiers are
+ bound, and that they are bound to syntax pattern variables, for example using
+ @racket[identifier-binding] and @racket[syntax-pattern-variable?]. This allows
+ libraries to also track variables bound by match-like forms, for example.}
@defform[(with-pvars (pvar ...) . body)
#:contracts ([pvar identifier?])]{