chibi-scheme/tests/syntax-tests.scm
2016-03-05 00:28:09 +09:00

77 lines
1.6 KiB
Scheme

(cond-expand
(modules (import (chibi) (only (chibi test) test-begin test test-end)))
(else #f))
(test-begin "syntax")
(define-syntax loop1
(sc-macro-transformer
(lambda (exp env)
(let ((body (cdr exp)))
`(call-with-current-continuation
(lambda (exit)
(let f ()
,@(map (lambda (exp)
(make-syntactic-closure env '(exit) exp))
body)
(f))))))))
(define exit 42)
(test 10 (loop1 (exit 10)))
(define (y) 0)
(define-syntax macro
(sc-macro-transformer
(lambda (exp env)
(make-syntactic-closure env '(y) (cadr exp)))))
(let ((y (lambda () 100)))
(test 0 (macro (y))))
(let ((x 10))
(define-syntax macro
(sc-macro-transformer
(lambda (exp env)
(make-syntactic-closure env '(x) (cadr exp)))))
(let ((x 20))
(define-syntax macro2
(sc-macro-transformer
(lambda (exp env)
(macro (make-syntactic-closure env '(x) (cadr exp))))))
(let ((x 30))
(test 20 (macro2 x)))))
(define E1 1)
(define-syntax M
(syntax-rules E1 ()
((M x E1) (quote (x E1)))))
(test '(1 2 3) (M 1 2 3))
(let ((E2 2))
(define-syntax N
(syntax-rules E2 ()
((N y E2) (quote (y E2)))))
(test '(1 2 3) (N 1 2 3)))
(define-syntax ell
(syntax-rules ()
((ell body)
(define-syntax emm
(syntax-rules ...1 ()
((emm) body))))))
(ell
(define-syntax enn
(syntax-rules ...1 () ((enn args ...1) (quote (args ...1))))))
(let ((... 'local))
(define-syntax asd
(syntax-rules ()
((asd x ...) (quote (... x)))))
(test '(2 1) (asd 1 2)))
(test-end)