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:
parent
1624e149f7
commit
0e18163366
4 changed files with 172 additions and 21 deletions
|
@ -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"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue