11 if (
auto i = old2new_.find(old_app); i != old2new_.end())
return i->second;
14 if (!
isa_optimizable(old_lam))
return RWPhase::rewrite_imm_App(old_app);
19 if (!
old_world().flags().aggressive_lam_spec && nest.
is_recursive())
return RWPhase::rewrite_imm_App(old_app);
24 DefVec new_doms, new_vars, new_args;
25 auto skip = lam->ret_var() && lam->is_closed();
26 auto doms = lam->doms();
28 for (
auto dom : doms.view().rsubspan(skip))
29 if (!dom->isa<
Pi>()) new_doms.emplace_back(dom);
31 if (skip) new_doms.emplace_back(doms.back());
32 if (new_doms.size() == lam->num_doms())
return RWPhase::rewrite_imm_App(old_app);
35 auto new_lam = lam->stub(w.cn(new_doms));
39 auto num_new = new_doms.size();
40 auto num_old = old_app->num_args();
42 for (
size_t arg_i = 0, var_i = 0, n = num_old - skip; arg_i != n; ++arg_i) {
43 auto arg =
rewrite(old_app->
arg(num_old, arg_i));
44 if (lam->dom(arg_i)->isa<
Pi>()) {
45 new_vars.emplace_back(arg);
47 new_vars.emplace_back(new_lam->var(num_new, var_i++));
48 new_args.emplace_back(arg);
53 new_vars.emplace_back(new_lam->var(num_new, num_new - 1));
54 new_args.emplace_back(
rewrite(old_app->
arg(num_old, num_old - 1)));
57 new_lam->
set(lam->reduce(w.tuple(new_vars)));
58 DLOG(
"{} -> {}: {} -> {})", lam, new_lam, lam->dom(), new_lam->dom());
60 return old2new_[old_app] = w.app(new_lam, new_args);