ir-macro-transformer was broken

This commit is contained in:
Yuichi Nishiwaki 2013-12-09 07:26:51 -08:00
parent 1ad4c309f4
commit 0dddddab55
2 changed files with 21 additions and 19 deletions

View File

@ -583,9 +583,6 @@
(identifier=? use-env x use-env y))
(make-syntactic-closure use-env '() (f expr rename compare))))
(define (acons key val alist)
(cons (cons key val) alist))
(define (walk f obj)
(if (pair? obj)
(cons (walk f (car obj)) (walk f (cdr obj)))
@ -595,21 +592,12 @@
(define (ir-macro-transformer f)
(lambda (expr use-env mac-env)
(let ((wrapped '()))
(define (inject obj)
(let ((s (make-syntactic-closure use-env '() obj)))
(set! wrapped (acons s obj wrapped))
s))
(define (extract obj)
(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 (inject identifier)
(make-syntactic-closure use-env '() identifier))
(define (compare x y)
(identifier=? mac-env x mac-env y))
(let ((expr (walk (lambda (x) (if (symbol? x) (inject x) x)) expr)))
(make-syntactic-closure mac-env '() (f expr inject compare)))))
(define-syntax or
(ir-macro-transformer

View File

@ -153,6 +153,20 @@ pic_identifier_p(pic_value obj)
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
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);
return v;
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_protect(pic, v);
return v;