if (cx.unrolls<=0) {
Pos p = span();
return new ExprBad(p, toString(), new ErrorType(p, "Macro substitution too deep; possibly indicating an infinite recursion."));
}
if (params.size() != args.size()) return this;
Context cx2 = new Context(realModule, warnings, cx.unrolls-1);
for(int n=params.size(), i=0; i<n; i++) {
Expr tmp = args.get(i);
if (!(tmp instanceof Macro)) tmp = tmp.resolve(tmp.type(), warnings);
cx2.put(params.get(i).label, tmp);
}
return cx2.check(body);
}