ir-macro-transformer was broken
This commit is contained in:
parent
1ad4c309f4
commit
0dddddab55
|
@ -583,9 +583,6 @@
|
||||||
(identifier=? use-env x use-env y))
|
(identifier=? use-env x use-env y))
|
||||||
(make-syntactic-closure use-env '() (f expr rename compare))))
|
(make-syntactic-closure use-env '() (f expr rename compare))))
|
||||||
|
|
||||||
(define (acons key val alist)
|
|
||||||
(cons (cons key val) alist))
|
|
||||||
|
|
||||||
(define (walk f obj)
|
(define (walk f obj)
|
||||||
(if (pair? obj)
|
(if (pair? obj)
|
||||||
(cons (walk f (car obj)) (walk f (cdr obj)))
|
(cons (walk f (car obj)) (walk f (cdr obj)))
|
||||||
|
@ -595,21 +592,12 @@
|
||||||
|
|
||||||
(define (ir-macro-transformer f)
|
(define (ir-macro-transformer f)
|
||||||
(lambda (expr use-env mac-env)
|
(lambda (expr use-env mac-env)
|
||||||
(let ((wrapped '()))
|
(define (inject identifier)
|
||||||
(define (inject obj)
|
(make-syntactic-closure use-env '() identifier))
|
||||||
(let ((s (make-syntactic-closure use-env '() obj)))
|
(define (compare x y)
|
||||||
(set! wrapped (acons s obj wrapped))
|
(identifier=? mac-env x mac-env y))
|
||||||
s))
|
(let ((expr (walk (lambda (x) (if (symbol? x) (inject x) x)) expr)))
|
||||||
(define (extract obj)
|
(make-syntactic-closure mac-env '() (f expr inject compare)))))
|
||||||
(let ((t (assq obj wrapped)))
|
|
||||||
(if t (cdr t) obj)))
|
|
||||||
(define (wrap expr)
|
|
||||||
(walk inject expr))
|
|
||||||
(define (unwrap expr)
|
|
||||||
(walk extract expr))
|
|
||||||
(define (compare x y)
|
|
||||||
(identifier=? use-env x use-env y))
|
|
||||||
(make-syntactic-closure mac-env '() (unwrap (f (wrap expr) inject compare))))))
|
|
||||||
|
|
||||||
(define-syntax or
|
(define-syntax or
|
||||||
(ir-macro-transformer
|
(ir-macro-transformer
|
||||||
|
|
16
src/macro.c
16
src/macro.c
|
@ -153,6 +153,20 @@ pic_identifier_p(pic_value obj)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
strip(pic_state *pic, pic_value expr)
|
||||||
|
{
|
||||||
|
if (pic_sc_p(expr)) {
|
||||||
|
return strip(pic, pic_sc(expr)->expr);
|
||||||
|
}
|
||||||
|
else if (pic_pair_p(expr)) {
|
||||||
|
return pic_cons(pic,
|
||||||
|
strip(pic, pic_car(pic, expr)),
|
||||||
|
strip(pic, pic_cdr(pic, expr)));
|
||||||
|
}
|
||||||
|
return expr;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pic_defsyntax(pic_state *pic, const char *name, struct pic_proc *macro, struct pic_senv *mac_env)
|
pic_defsyntax(pic_state *pic, const char *name, struct pic_proc *macro, struct pic_senv *mac_env)
|
||||||
{
|
{
|
||||||
|
@ -365,7 +379,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
|
||||||
pic_gc_protect(pic, v);
|
pic_gc_protect(pic, v);
|
||||||
return v;
|
return v;
|
||||||
case PIC_STX_QUOTE:
|
case PIC_STX_QUOTE:
|
||||||
v = pic_cons(pic, pic_symbol_value(pic_syntax(car)->sym), pic_cdr(pic, expr));
|
v = pic_cons(pic, pic_symbol_value(pic_syntax(car)->sym), strip(pic, pic_cdr(pic, expr)));
|
||||||
pic_gc_arena_restore(pic, ai);
|
pic_gc_arena_restore(pic, ai);
|
||||||
pic_gc_protect(pic, v);
|
pic_gc_protect(pic, v);
|
||||||
return v;
|
return v;
|
||||||
|
|
Loading…
Reference in New Issue