public IEnumerable <FuncDef> GetFunc(string name, int arity) { if (name == null) { var ctx = this; while (ctx != null) { foreach (var v in ctx.values) { var fd = v as FuncDef; if (fd != null) { yield return(fd); } } ctx = ctx.parent; } } else { int i = IndexOf(name); if (i >= 0) { var v = this[i]; if (v is FuncDef) { var def = (FuncDef)v; if (def.minArity <= arity && arity <= def.maxArity) { yield return(def); } } else if (v is LazyAsync) { AsyncFn f = (ae, args) => { return(OPs._call_func(ae, i, args)); }; yield return(new FuncDef(f, 0, int.MaxValue, name)); } } } for (int i = externalFuncs.Count - 1; i >= 0; i--) { foreach (var fd in externalFuncs[i](name, arity)) { yield return(fd); } } }