(define-syntax out (er-macro-transformer (lambda (expr rename compare) (for-each set-cdr! (car (cddr expr)) (cadr (cddr expr))) (car (cdr expr))))) (%define-syntax syntax-parameterize (lambda (expr use-env mac-env) (let* ((_let (make-syntactic-closure mac-env '() 'let)) (_set! (make-syntactic-closure mac-env '() 'set!)) (_out (make-syntactic-closure mac-env '() 'out)) (_tmp (make-syntactic-closure mac-env '() 'tmp)) (bindings (cadr expr)) (body (cddr expr)) (keywords (map car bindings)) (transformers (map cadr bindings)) (cells (map (lambda (keyword) (env-cell use-env keyword)) keywords)) (old (map cdr cells)) (new (map (lambda (transformer) (make-macro (make-transformer (eval (make-syntactic-closure use-env '() transformer))) use-env)) transformers))) (for-each set-cdr! cells new) `(,_let ((,_tmp #f)) (,_set! ,_tmp (,_let () ,@body)) (,_out ,_tmp ,cells ,old)))))