Beispiel #1
0
 public FuncValue(NestedEnv env, string[] ps, IASTNode body)
 {
     Env        = env;
     Params     = ps;
     ParamTypes = null;
     Body       = body;
 }
Beispiel #2
0
 public FuncValue(NestedEnv env, string[] @params, string[] paramTypes, IASTNode[] defaults, IASTNode body)
 {
     Env        = env;
     Params     = @params;
     ParamTypes = paramTypes;
     Defaults   = defaults;
     Body       = body;
 }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
 public NestedEnv()
 {
     Parent = null;
 }
Beispiel #5
0
 public NestedEnv(NestedEnv parent)
 {
     Parent = parent;
 }
Beispiel #6
0
 public Value SetValue(Value baseValue, NestedEnv env, Value value) => NilValue.Nil;
Beispiel #7
0
 public Value GetValue(Value baseValue, NestedEnv env) => Body(env);
Beispiel #8
0
        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);
        }