1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-18 01:30:27 +02:00

Implement R7RS 'syntax-error'.

* module/ice-9/psyntax.scm (syntax-error): New macro.
  (syntax-rules): Handle 'syntax-error' templates specially
  for improved error reporting.

* module/ice-9/psyntax-pp.scm: Regenerate.

* doc/ref/api-macros.texi (Syntax Rules): Add new subsection "Reporting
  Syntax Errors in Macros".

* test-suite/tests/syntax.test: Add tests.
This commit is contained in:
Mark H Weaver 2013-12-19 13:22:50 -05:00
parent 1624e149f7
commit 0e18163366
4 changed files with 172 additions and 21 deletions

View file

@ -1211,6 +1211,47 @@
(define-syntax bar (foo x y z))
(bar a b c))))
(with-test-prefix "syntax-error"
(pass-if-syntax-error "outside of macro without args"
"test error"
(eval '(syntax-error "test error")
(interaction-environment)))
(pass-if-syntax-error "outside of macro with args"
"test error x \\(y z\\)"
(eval '(syntax-error "test error" x (y z))
(interaction-environment)))
(pass-if-equal "within macro"
'(simple-let
"expected an identifier but got (z1 z2)"
(simple-let ((y (* x x))
((z1 z2) (values x x)))
(+ y 1)))
(catch 'syntax-error
(lambda ()
(eval '(let ()
(define-syntax simple-let
(syntax-rules ()
((_ (head ... ((x . y) val) . tail)
body1 body2 ...)
(syntax-error
"expected an identifier but got"
(x . y)))
((_ ((name val) ...) body1 body2 ...)
((lambda (name ...) body1 body2 ...)
val ...))))
(define (foo x)
(simple-let ((y (* x x))
((z1 z2) (values x x)))
(+ y 1)))
foo)
(interaction-environment))
(error "expected syntax-error exception"))
(lambda (k who what where form . maybe-subform)
(list who what form)))))
(with-test-prefix "syntax-case"
(pass-if-syntax-error "duplicate pattern variable"