add ir-macro-transformer
This commit is contained in:
parent
8e84242626
commit
6d0f75dd7e
|
@ -177,33 +177,6 @@
|
||||||
(single-for-each f list)
|
(single-for-each f list)
|
||||||
(multiple-for-each f (cons list lists))))
|
(multiple-for-each f (cons list lists))))
|
||||||
|
|
||||||
(define sc-macro-transformer
|
|
||||||
(lambda (f)
|
|
||||||
(lambda (expr use-env mac-env)
|
|
||||||
(make-syntactic-closure mac-env '() (f expr use-env)))))
|
|
||||||
|
|
||||||
(define rsc-macro-transformer
|
|
||||||
(lambda (f)
|
|
||||||
(lambda (expr use-env mac-env)
|
|
||||||
(make-syntactic-closure use-env '() (f expr mac-env)))))
|
|
||||||
|
|
||||||
(define er-macro-transformer
|
|
||||||
(lambda (f)
|
|
||||||
(lambda (expr use-env mac-env)
|
|
||||||
((lambda (rename compare) (f expr rename compare))
|
|
||||||
((lambda (renames)
|
|
||||||
(lambda (identifier)
|
|
||||||
((lambda (cell)
|
|
||||||
(if cell
|
|
||||||
(cdr cell)
|
|
||||||
((lambda (name)
|
|
||||||
(set! renames (cons (cons identifier name) renames))
|
|
||||||
name)
|
|
||||||
(make-syntactic-closure mac-env '() identifier))))
|
|
||||||
(assq identifier renames))))
|
|
||||||
'())
|
|
||||||
(lambda (x y) (identifier=? use-env x use-env y))))))
|
|
||||||
|
|
||||||
(define-macro (let bindings . body)
|
(define-macro (let bindings . body)
|
||||||
(if (symbol? bindings)
|
(if (symbol? bindings)
|
||||||
(begin
|
(begin
|
||||||
|
@ -561,3 +534,38 @@
|
||||||
(bytevector-copy! res (bytevector-length v) w)
|
(bytevector-copy! res (bytevector-length v) w)
|
||||||
res))
|
res))
|
||||||
(fold bytevector-append-2-inv #() vs))
|
(fold bytevector-append-2-inv #() vs))
|
||||||
|
|
||||||
|
;;; hygienic macros
|
||||||
|
|
||||||
|
(define (walk f obj)
|
||||||
|
(write obj)
|
||||||
|
(newline)
|
||||||
|
(if (pair? obj)
|
||||||
|
(cons (walk f (car obj)) (walk f (cdr obj)))
|
||||||
|
(if (vector? obj)
|
||||||
|
(list->vector (map (lambda (x) (walk f x)) (vector->list obj)))
|
||||||
|
(f obj))))
|
||||||
|
|
||||||
|
(define (sc-macro-transformer f)
|
||||||
|
(lambda (expr use-env mac-env)
|
||||||
|
(make-syntactic-closure mac-env '() (f expr use-env))))
|
||||||
|
|
||||||
|
(define (rsc-macro-transformer f)
|
||||||
|
(lambda (expr use-env mac-env)
|
||||||
|
(make-syntactic-closure use-env '() (f expr mac-env))))
|
||||||
|
|
||||||
|
(define (er-macro-transformer f)
|
||||||
|
(lambda (expr use-env mac-env)
|
||||||
|
(define (rename identifier)
|
||||||
|
(make-syntactic-closure mac-env '() identifier))
|
||||||
|
(define (compare x y)
|
||||||
|
(identifier=? use-env x use-env y))
|
||||||
|
(make-syntactic-closure use-env '() (f expr rename compare))))
|
||||||
|
|
||||||
|
(define (ir-macro-transformer f)
|
||||||
|
(lambda (expr use-env mac-env)
|
||||||
|
(define (inject identifier)
|
||||||
|
(make-syntactic-closure use-env '() identifier))
|
||||||
|
(define (compare x y)
|
||||||
|
(identifier=? use-env x use-env y))
|
||||||
|
(make-syntactic-closure mac-env '() (f (walk inject expr) inject compare))))
|
||||||
|
|
Loading…
Reference in New Issue