From 0840430b21eb70cc4e9ac7b97e8fea9f9838404a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 11 Feb 2011 09:51:24 -0700 Subject: [PATCH] clean up `define-syntax-rules' by removing a redundant expression in an error message, adding tests, and documenting the fact that a syntax-error message can expose the pattern source to users --- collects/racket/private/misc.rkt | 6 +++--- .../scribblings/reference/stx-patterns.scrbl | 4 +++- collects/tests/racket/stx.rktl | 21 +++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/collects/racket/private/misc.rkt b/collects/racket/private/misc.rkt index 26aba931c1..938da11c82 100644 --- a/collects/racket/private/misc.rkt +++ b/collects/racket/private/misc.rkt @@ -26,10 +26,10 @@ ([(sexpr) (syntax->datum user-stx)] [(msg) (if (pair? sexpr) - (format "~.s did not match pattern ~.s" - sexpr (cons (car sexpr) 'pattern)) + (format "use does not match pattern: ~.s" + (cons (car sexpr) 'pattern)) (if (symbol? sexpr) - (format "must be used in a pattern ~.s" + (format "use does not match pattern: ~.s" (cons sexpr 'pattern)) (error 'internal-error "something bad happened")))]) diff --git a/collects/scribblings/reference/stx-patterns.scrbl b/collects/scribblings/reference/stx-patterns.scrbl index e3641fe452..62b29fdb90 100644 --- a/collects/scribblings/reference/stx-patterns.scrbl +++ b/collects/scribblings/reference/stx-patterns.scrbl @@ -469,7 +469,9 @@ Equivalent to (syntax-rules () [(id . pattern) template])) ] -} + +but with syntax errors potentially phrased in terms of +@racket[pattern].} @defidform[...]{ diff --git a/collects/tests/racket/stx.rktl b/collects/tests/racket/stx.rktl index ebb92f87cc..deb76e0020 100644 --- a/collects/tests/racket/stx.rktl +++ b/collects/tests/racket/stx.rktl @@ -1456,6 +1456,27 @@ (get-output-bytes s)) exn:fail?) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; define-syntax-rule + +(define-syntax-rule (a-rule-pattern x [y z]) + (list 'x 'y 'z)) + +(test '(1 2 3) 'a-rule (a-rule-pattern 1 [2 3])) +(test '(1 2 3) 'a-rule (a-rule-pattern 1 . ([2 3]))) +(test '(1 2 3) 'a-rule (a-rule-pattern 1 [2 . (3)])) +(syntax-test #'a-rule-pattern) +(syntax-test #'(a-rule-pattern 1 2 3)) +(syntax-test #'(a-rule-pattern 1 . 2)) +(syntax-test #'(a-rule-pattern . 1)) +(syntax-test #'(a-rule-pattern 1 [2 3] 4)) + +(let ([no-match? (lambda (exn) + (regexp-match? #"does not match pattern" (exn-message exn)))]) + (error-test #'a-rule-pattern no-match?) + (error-test #'(a-rule-pattern) no-match?) + (error-test #'(a-rule-pattern 1) no-match?)) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs)