mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-10 22:10:21 +02:00
catch syntax errors in unquote and unquote-splicing
* module/ice-9/psyntax.scm (quasiquote): Catch syntax errors in unquote and unquote-splicing. * module/ice-9/psytax-pp.scm: Regenerated.
This commit is contained in:
parent
2032f3d1db
commit
40b36cfbbe
3 changed files with 29 additions and 14 deletions
File diff suppressed because one or more lines are too long
|
@ -2355,12 +2355,22 @@
|
|||
(syntax p)
|
||||
(quasicons (syntax (quote unquote))
|
||||
(quasi (syntax (p)) (- lev 1)))))
|
||||
((unquote . args)
|
||||
(= lev 0)
|
||||
(syntax-violation 'unquote
|
||||
"unquote takes exactly one argument"
|
||||
p (syntax (unquote . args))))
|
||||
(((unquote-splicing p) . q)
|
||||
(if (= lev 0)
|
||||
(quasiappend (syntax p) (quasi (syntax q) lev))
|
||||
(quasicons (quasicons (syntax (quote unquote-splicing))
|
||||
(quasi (syntax (p)) (- lev 1)))
|
||||
(quasi (syntax q) lev))))
|
||||
(((unquote-splicing . args) . q)
|
||||
(= lev 0)
|
||||
(syntax-violation 'unquote-splicing
|
||||
"unquote-splicing takes exactly one argument"
|
||||
p (syntax (unquote-splicing . args))))
|
||||
((quasiquote p)
|
||||
(quasicons (syntax (quote quasiquote))
|
||||
(quasi (syntax (p)) (+ lev 1))))
|
||||
|
|
|
@ -21,6 +21,11 @@
|
|||
:use-module (test-suite lib))
|
||||
|
||||
|
||||
(define exception:generic-syncase-error
|
||||
(cons 'syntax-error "Source expression failed to match"))
|
||||
(define exception:unexpected-syntax
|
||||
(cons 'syntax-error "unexpected syntax"))
|
||||
|
||||
(define exception:bad-expression
|
||||
(cons 'syntax-error "Bad expression"))
|
||||
|
||||
|
@ -67,13 +72,13 @@
|
|||
(with-test-prefix "Bad argument list"
|
||||
|
||||
(pass-if-exception "improper argument list of length 1"
|
||||
exception:wrong-num-args
|
||||
exception:generic-syncase-error
|
||||
(eval '(let ((foo (lambda (x y) #t)))
|
||||
(foo . 1))
|
||||
(interaction-environment)))
|
||||
|
||||
(pass-if-exception "improper argument list of length 2"
|
||||
exception:wrong-num-args
|
||||
exception:generic-syncase-error
|
||||
(eval '(let ((foo (lambda (x y) #t)))
|
||||
(foo 1 . 2))
|
||||
(interaction-environment))))
|
||||
|
@ -88,7 +93,7 @@
|
|||
|
||||
;; Fixed on 2001-3-3
|
||||
(pass-if-exception "empty parentheses \"()\""
|
||||
exception:illegal-empty-combination
|
||||
exception:unexpected-syntax
|
||||
(eval '()
|
||||
(interaction-environment)))))
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue