public static TEx <T> Let <T, L>(string alias, Func <TExArgCtx, TEx <L> > content, Func <TEx <T> > inner, TExArgCtx applier) { var variabl = V <L>(); using var let = applier.Let(alias, variabl); return(Ex.Block(new[] { variabl }, Ex.Assign(variabl, content(applier)), inner() )); }
public static Ex Let2(Alias[] aliases, Func <Ex> inner, TExArgCtx applier) { var stmts = new Ex[aliases.Length + 1]; var vars = new ParameterExpression[aliases.Length]; var lets = new List <IDisposable>(); for (int ii = 0; ii < aliases.Length; ++ii) { Ex alias_value = aliases[ii].func(applier); lets.Add(applier.Let(aliases[ii].alias, vars[ii] = V(alias_value.Type, applier.Ctx.NameWithSuffix(aliases[ii].alias)))); stmts[ii] = Ex.Assign(vars[ii], alias_value); } stmts[aliases.Length] = inner(); for (int ii = 0; ii < lets.Count; ++ii) { lets[ii].Dispose(); } return(Ex.Block(vars, stmts)); }