Exemplo n.º 1
0
        public Value ExecFunction(ExecutionContext vm, string name, params Value[] values)
        {
            // ローカル変数を作成
            var lv = new LocalVariables();
            // 引数を作成する
            var argv = new Value(values);

            lv.AddVariable("argv", argv);
            // 引数の数を保存する
            var argc = new Value(values.Length);

            lv.AddVariable("argc", argc);
            // まずシステム関数を優先する
            if (systemFunctions.ContainsKey(name))
            {
                return(systemFunctions[name].Execute(vm, lv));
            }
            // その後にユーザー登録関数から検索する
            var function = new List <IFunction>(functions[name]);

            for (var i = 0; i < function.Count; i++)
            {
                if (!function[i].IsExecutable(vm, lv))
                {
                    function.RemoveAt(i);
                    --i;
                }
            }
            if (function.Count != 0)
            {
                return(function[vm.Random.Next(function.Count)].Execute(vm, lv));
            }
            else
            {
                return(new Value());
            }
        }