summaryrefslogtreecommitdiff
path: root/test-suite/tests/syntax.test
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-06-17 14:39:32 +0200
committerAndy Wingo <wingo@pobox.com>2010-06-17 14:39:32 +0200
commit5f8c55ce3bd1ff0e4acd3ade42cf9ccde3cf0fa9 (patch)
tree4a16f79a7fb6c3ce40f817d3bf6585472129ba75 /test-suite/tests/syntax.test
parent417ee09802eccb7c6d8729ecc5f311433cec755c (diff)
downloadguile-5f8c55ce3bd1ff0e4acd3ade42cf9ccde3cf0fa9.tar.gz
fix order of internal definitions
* module/ice-9/psyntax.scm (chi-body): Whoops, actually render internal definitions into a letrec* in the right order. * module/ice-9/psyntax-pp.scm: Regenerate. * test-suite/tests/syntax.test: Add some letrec* tests.
Diffstat (limited to 'test-suite/tests/syntax.test')
-rw-r--r--test-suite/tests/syntax.test92
1 files changed, 92 insertions, 0 deletions
diff --git a/test-suite/tests/syntax.test b/test-suite/tests/syntax.test
index f347c2cec..035ebf865 100644
--- a/test-suite/tests/syntax.test
+++ b/test-suite/tests/syntax.test
@@ -45,6 +45,8 @@
'(syntax-error . "bad let "))
(define exception:bad-letrec
'(syntax-error . "bad letrec "))
+(define exception:bad-letrec*
+ '(syntax-error . "bad letrec\\* "))
(define exception:bad-set!
'(syntax-error . "bad set!"))
(define exception:bad-quote
@@ -463,6 +465,96 @@
(eval '(letrec ((x 1)))
(interaction-environment)))))
+(with-test-prefix "letrec*"
+
+ (with-test-prefix "bindings"
+
+ (pass-if-exception "initial bindings are undefined"
+ exception:used-before-defined
+ (begin
+ ;; FIXME: the memoizer does initialize the var to undefined, but
+ ;; the Scheme evaluator has no way of checking what's an
+ ;; undefined value. Not sure how to do this.
+ (throw 'unresolved)
+ (letrec* ((x y) (y 1)) y))))
+
+ (with-test-prefix "bad bindings"
+
+ (pass-if-exception "(letrec*)"
+ exception:bad-letrec*
+ (eval '(letrec*)
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* 1)"
+ exception:bad-letrec*
+ (eval '(letrec* 1)
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* (x))"
+ exception:bad-letrec*
+ (eval '(letrec* (x))
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* (x) 1)"
+ exception:bad-letrec*
+ (eval '(letrec* (x) 1)
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* ((x)) 3)"
+ exception:bad-letrec*
+ (eval '(letrec* ((x)) 3)
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* ((x 1) y) x)"
+ exception:bad-letrec*
+ (eval '(letrec* ((x 1) y) x)
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* x ())"
+ exception:bad-letrec*
+ (eval '(letrec* x ())
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* x (y))"
+ exception:bad-letrec*
+ (eval '(letrec* x (y))
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* ((1 2)) 3)"
+ exception:bad-letrec*
+ (eval '(letrec* ((1 2)) 3)
+ (interaction-environment))))
+
+ (with-test-prefix "duplicate bindings"
+
+ (pass-if-exception "(letrec* ((x 1) (x 2)) x)"
+ exception:duplicate-binding
+ (eval '(letrec* ((x 1) (x 2)) x)
+ (interaction-environment))))
+
+ (with-test-prefix "bad body"
+
+ (pass-if-exception "(letrec* ())"
+ exception:bad-letrec*
+ (eval '(letrec* ())
+ (interaction-environment)))
+
+ (pass-if-exception "(letrec* ((x 1)))"
+ exception:bad-letrec*
+ (eval '(letrec* ((x 1)))
+ (interaction-environment))))
+
+ (with-test-prefix "referencing previous values"
+ (pass-if (equal? (letrec ((a (cons 'foo 'bar))
+ (b a))
+ b)
+ '(foo . bar)))
+ (pass-if (equal? (let ()
+ (define a (cons 'foo 'bar))
+ (define b a)
+ b)
+ '(foo . bar)))))
+
(with-test-prefix "if"
(with-test-prefix "missing or extra expressions"