always emit the same unique symbol for unbound variable

This commit is contained in:
Yuichi Nishiwaki 2013-12-09 09:32:30 -08:00
parent b231d63297
commit 74feec78f1
1 changed files with 7 additions and 2 deletions

View File

@ -240,16 +240,21 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
} }
case PIC_TT_SYMBOL: { case PIC_TT_SYMBOL: {
struct xh_entry *e; struct xh_entry *e;
while (senv) { pic_sym uniq;
while (true) {
if ((e = xh_get(senv->tbl, pic_symbol_name(pic, pic_sym(expr)))) != NULL) { if ((e = xh_get(senv->tbl, pic_symbol_name(pic, pic_sym(expr)))) != NULL) {
if (e->val >= 0) if (e->val >= 0)
return pic_symbol_value((pic_sym)e->val); return pic_symbol_value((pic_sym)e->val);
else else
return pic_obj_value(senv->stx[~e->val]); return pic_obj_value(senv->stx[~e->val]);
} }
if (! senv->up)
break;
senv = senv->up; senv = senv->up;
} }
return pic_symbol_value(new_uniq_sym(pic, pic_sym(expr))); uniq = new_uniq_sym(pic, pic_sym(expr));
xh_put(senv->tbl, pic_symbol_name(pic, pic_sym(expr)), (int)uniq);
return pic_symbol_value(uniq);
} }
case PIC_TT_PAIR: { case PIC_TT_PAIR: {
pic_value car, v; pic_value car, v;