racket/collects/tests/syntax/free-vars.rkt
Matthew Flatt 6fded4bac1 syntax/free-vars: fix quadratic behavior
(Forgot to fix the "FIXME" before committing last time.)
2012-05-28 20:22:31 -06:00

43 lines
1.2 KiB
Racket

#lang racket
(require syntax/free-vars)
(parameterize ([current-namespace (make-base-namespace)])
(define (check stx)
(syntax-case (expand stx) (quote)
[(let-vals bindings (quote free) body)
(unless (andmap free-identifier=?
(syntax->list #'free)
(free-vars #'body))
(error "wrong answer: ~e" stx))]))
(check #'(let ([x 1])
'(x)
x))
(check #'(let ([x 1]
[y 2])
'(x y)
(x y)))
(check #'(let ([x 1]
[y 2])
'(y x)
(y x)))
(check #'(let ([x 1]
[y 2])
'(x y)
(let-syntax ([ex (syntax-rules () [(foo) x])])
(list x y (ex)))))
(check #'(let ([x 1]
[y 2])
'(x y)
(let-syntax ([ex (syntax-rules () [(foo) x])])
(list (ex) y x))))
(check #'(let ([x 1]
[y 2])
'(x)
(let-syntax ([ex (syntax-rules () [(foo) x])])
(lambda (z) (ex)))))
(check #'(let ([x 1]
[y 2])
'(x)
(let ([y 3])
(list x y)))))