diff --git a/lib/init-7.scm b/lib/init-7.scm index 3a63da9a..5ae72c0f 100644 --- a/lib/init-7.scm +++ b/lib/init-7.scm @@ -693,7 +693,7 @@ (_vector->list (rename 'vector->list)) (_list->vector (rename 'list->vector)) (_cons3 (rename 'cons-source))) - (define ellipsis (rename (if ellipsis-specified? (cadr expr) '...))) + (define ellipsis (if ellipsis-specified? (cadr expr) (rename '...))) (define lits (if ellipsis-specified? (car (cddr expr)) (cadr expr))) (define forms (if ellipsis-specified? (cdr (cddr expr)) (cddr expr))) (define (next-symbol s) diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm new file mode 100644 index 00000000..04f61a30 --- /dev/null +++ b/tests/syntax-tests.scm @@ -0,0 +1,60 @@ + +(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))) + +(test-end)