chibi-scheme/lib/srfi/139.scm
2020-06-16 11:43:47 +09:00

32 lines
1.2 KiB
Scheme

(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)))))