public FuncValue(NestedEnv env, string[] ps, IASTNode body) { Env = env; Params = ps; ParamTypes = null; Body = body; }
public FuncValue(NestedEnv env, string[] @params, string[] paramTypes, IASTNode[] defaults, IASTNode body) { Env = env; Params = @params; ParamTypes = paramTypes; Defaults = defaults; Body = body; }
public override Value Invoke(Value[] args) { NestedEnv env = new NestedEnv(Env); if (CheckAndFill(args, Params, ParamTypes, Defaults, env, false, out string err)) { return(Body.GetValue(null, env)); } else { Value r = NilValue.Nil; r["err"] = new StringValue(err); return(r); } }
public NestedEnv() { Parent = null; }
public NestedEnv(NestedEnv parent) { Parent = parent; }
public Value SetValue(Value baseValue, NestedEnv env, Value value) => NilValue.Nil;
public Value GetValue(Value baseValue, NestedEnv env) => Body(env);
public static bool CheckAndFill(Value[] args, string[] ps, string[] types, IASTNode[] defaults, NestedEnv env, bool collect, out string err) { err = ""; int i = 0; for (; i < ps.Length; i++) { if (i < args.Length) { if (types != null && i < types.Length && types[i] != null && types[i] != args[i].Type) { err += $"第{i}个参数,应为{types[i]},却得到{args[i].Type};"; } else { env[ps[i]] = args[i]; } } else { env[ps[i]] = (defaults != null && i < defaults.Length) ? defaults[i].GetValue(null, env) : NilValue.Nil; } } return(err.Length == 0); }