/// <summary> /// This is a simple yet effective combination of optimizations. /// </summary> static public QuotedFunction Optimize(INameLookup names, QuotedFunction qf) { //qf = ApplyMacros(qf); //qf = ApplyMacros(qf); //qf = Expand(qf); //qf = ApplyMacros(qf); //qf = PartialEval(qf); //qf = Expand(qf); //qf = ReplaceSimpleQuotations(qf); qf = ApplyMacros(names, qf); qf = ExpandInline(qf, 4); qf = ApplyMacros(names, qf); return qf; }
public override void Eval(Executor exec) { QuotedFunction right = exec.TypedPop<QuotedFunction>(); QuotedFunction left = exec.TypedPop<QuotedFunction>(); QuotedFunction f = new QuotedFunction(left, right); exec.PushFxn(f); }
/// <summary> /// This will reduce an expression by evaluating as much at compile-time as possible. /// </summary> public static QuotedFunction PartialEval(QuotedFunction qf) { Executor exec = new Executor(); return new QuotedFunction(PartialEval(exec, qf.GetSubFxns())); }
static public QuotedFunction ApplyMacros(INameLookup names, QuotedFunction f) { CatExpr list = new CatExpr(f.GetSubFxns().ToArray()); MetaCat.ApplyMacros(names, list); return new QuotedFunction(list); }
static void ExpandInline(CatExpr fxns, QuotedFunction q, int nMaxDepth) { foreach (Function f in q.GetSubFxns()) ExpandInline(fxns, f, nMaxDepth - 1); }
static public QuotedFunction ExpandInline(QuotedFunction f, int nMaxDepth) { CatExpr ret = new CatExpr(); ExpandInline(ret, f, nMaxDepth); return new QuotedFunction(ret); }