Don't try to apply a broken let during simplification.

This commit is contained in:
Alex Shinn 2011-10-17 08:27:21 +09:00
parent 5ff0aa4397
commit 549257efca

View file

@ -56,32 +56,34 @@ static sexp simplify (sexp ctx, sexp ast, sexp init_substs, sexp lambda) {
ls1 = app; ls1 = app;
ls2 = sexp_cdr(app); ls2 = sexp_cdr(app);
sv = sexp_lambda_sv(sexp_car(app)); sv = sexp_lambda_sv(sexp_car(app));
for ( ; sexp_pairp(ls2); ls2=sexp_cdr(ls2), p2=sexp_cdr(p2)) { if (sexp_length(ctx, p2) == sexp_length(ctx, ls2)) {
if (sexp_not(sexp_memq(ctx, sexp_car(p2), sv)) for ( ; sexp_pairp(ls2); ls2=sexp_cdr(ls2), p2=sexp_cdr(p2)) {
&& (! sexp_pointerp(sexp_car(ls2)) || sexp_litp(sexp_car(ls2)) if (sexp_not(sexp_memq(ctx, sexp_car(p2), sv))
|| (sexp_refp(sexp_car(ls2)) && (! sexp_pointerp(sexp_car(ls2)) || sexp_litp(sexp_car(ls2))
&& sexp_lambdap(sexp_ref_loc(sexp_car(ls2))) || (sexp_refp(sexp_car(ls2))
&& sexp_not(sexp_memq(ctx, sexp_ref_name(sexp_car(ls2)), && sexp_lambdap(sexp_ref_loc(sexp_car(ls2)))
sexp_lambda_sv(sexp_ref_loc(sexp_car(ls2)))))))) { && sexp_not(sexp_memq(ctx, sexp_ref_name(sexp_car(ls2)),
tmp = sexp_cons(ctx, sexp_car(app), sexp_car(ls2)); sexp_lambda_sv(sexp_ref_loc(sexp_car(ls2)))))))) {
tmp = sexp_cons(ctx, sexp_car(p2), tmp); tmp = sexp_cons(ctx, sexp_car(app), sexp_car(ls2));
sexp_push(ctx, substs, tmp); tmp = sexp_cons(ctx, sexp_car(p2), tmp);
sexp_cdr(ls1) = sexp_cdr(ls2); sexp_push(ctx, substs, tmp);
if (p1) sexp_cdr(ls1) = sexp_cdr(ls2);
sexp_cdr(p1) = sexp_cdr(p2); if (p1)
else sexp_cdr(p1) = sexp_cdr(p2);
sexp_lambda_params(sexp_car(app)) = sexp_cdr(p2); else
} else { sexp_lambda_params(sexp_car(app)) = sexp_cdr(p2);
p1 = p2; } else {
ls1 = ls2; p1 = p2;
ls1 = ls2;
}
} }
sexp_lambda_body(sexp_car(app))
= simplify(ctx, sexp_lambda_body(sexp_car(app)), substs, sexp_car(app));
if (sexp_nullp(sexp_cdr(app))
&& sexp_nullp(sexp_lambda_params(sexp_car(app)))
&& sexp_nullp(sexp_lambda_defs(sexp_car(app))))
app = sexp_lambda_body(sexp_car(app));
} }
sexp_lambda_body(sexp_car(app))
= simplify(ctx, sexp_lambda_body(sexp_car(app)), substs, sexp_car(app));
if (sexp_nullp(sexp_cdr(app))
&& sexp_nullp(sexp_lambda_params(sexp_car(app)))
&& sexp_nullp(sexp_lambda_defs(sexp_car(app))))
app = sexp_lambda_body(sexp_car(app));
} }
res = app; res = app;
break; break;