43 lines
1.2 KiB
Racket
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)))))
|