diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/letrec.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/letrec.rktl new file mode 100644 index 0000000000..24d51afaed --- /dev/null +++ b/pkgs/racket-pkgs/racket-test/tests/racket/letrec.rktl @@ -0,0 +1,91 @@ + + +(load-relative "loadtest.rktl") + +(Section 'letrec) + +;; ============================================================================= + +(define letrec-exn? exn:fail:contract:variable?) + +(test 5 'const (letrec ([x 5]) 5)) +(test 5 'var-ref (letrec ([x 5]) x)) + +(test #t 'lambda (procedure? (letrec ([x (lambda () 5)]) x))) +(test #t 'lambda-rest-args (procedure? (letrec ([x (lambda l l)]) x))) +(test 5 'lambda-called (letrec ([x (lambda () 5)]) (x))) +(test (list 5) 'lambda-rest-args-called (letrec ([x (lambda l l)] [y (x 5)]) y)) + +(err/rt-test (letrec ([x x]) x) letrec-exn?) +(err/rt-test (letrec ([x y] [y 5]) y) letrec-exn?) + +(test #t 'begin + (procedure? + (letrec ([x (begin (lambda () y) + (lambda () z))] + [y 5] + [z 6]) + x))) + +(err/rt-test + (letrec ([x ((lambda l z) 5)] [z 5]) x) + letrec-exn?) + +(test 5 'nested (letrec ([x (letrec ([y 6]) 5)]) x)) +(test 5 'nested-more (letrec ([x (letrec ([y 5]) y)]) x)) +(test 5 'nested-even-more (letrec ([x 5] [y (letrec ([z x]) z)]) y)) + +(err/rt-test + (letrec ([q (lambda () s)] [r (q)] [s 5]) r) + letrec-exn?) + +(test 5 'reordered (letrec ([s 5] [q (lambda () s)] [r (q)]) r)) + +(test 5 'set! (letrec ([x 0] + [f (lambda (v) (set! x v))]) + (begin (f 5) x))) + +(err/rt-test + (letrec ([f (lambda () (letrec ([x x]) 5))] + [g (f)]) + g) + letrec-exn?) + +(test #t 'checked-but-ok + (procedure? + (letrec ([y (lambda () (letrec ([x x]) x))]) + y))) + +(err/rt-test + (letrec ([a (letrec ([y (lambda () x)]) (lambda () (y)))] [x (a)]) x) + letrec-exn?) + +(err/rt-test + (letrec ([a (letrec ([x (lambda () (y))] [y (lambda () a)]) (x))]) a) + letrec-exn?) + +(err/rt-test + (letrec ([w (lambda () r)] + [z (lambda () 5)] + [x (set! z w)] + [y (set! x (z))] + [r 5]) + x) + letrec-exn?) + +(err/rt-test + (letrec-values ([(x y) (values (lambda () z) (lambda () z))] [(z) (y)]) z) + letrec-exn?) + +(test #t 'checked-but-ok + (procedure? + (let ([proc (letrec ([x (letrec ([v (lambda () x)]) v)]) x)]) + (proc)))) + +(err/rt-test + (letrec ([x (letrec ([v (lambda () y)]) v)] + [y (x)]) + y) + letrec-exn?) + +(report-errs) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 732faa85e6..1c79ac0429 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -920,6 +920,7 @@ ;; Don't optimize away use before definition: (test-comp '(letrec ([x (begin x 5)]) x) '5 #f) +(test-comp '(letrec ([x (letrec ([y 5]) x 6)]) x) '6 #f) (test-comp '(let ([x 5]) (set! x 2)) '(let ([x 5]) (set! x x) (set! x 2)))