Beispiel #1
0
        public object Execute(KarinEngine engine, FunctionToken token, object pipedObj)
        {
            var args = token.Arguments;

            if (args.Length != 2)
            {
                throw new KarinException($"{Name}関数の引数の数が不正です。");
            }

            //回数条件
            var co = engine.Ride(args[0]);

            //繰り返し実行
            object ret = null;

            for (var c = 0; c < (int)co; c++)
            {
                ret = engine.Ride(args[1]);
                if (ret is ReturnedObject)
                {
                    break;
                }
            }
            return(ret);
        }
Beispiel #2
0
        public object Execute(KarinEngine engine, FunctionToken token, object pipedObj)
        {
            var args = token.Arguments;

            if (!(2 <= args.Length || args.Length <= 3))
            {
                throw new KarinException($"{Name}関数の引数の数が不正です。");
            }

            //条件を演算
            var sw = engine.Ride(args[0]);

            if (!(sw is bool))
            {
                throw new KarinException($"{Name}関数の条件を評価できません。");
            }

            //どちらかを実行
            if ((bool)sw)
            {
                return(engine.Ride(args[1]));
            }
            else
            {
                return(args.Length == 3 ? engine.Ride(args[2]) : null);
            }
        }
Beispiel #3
0
        public object Execute(KarinEngine engine, FunctionToken token, object pipedObj)
        {
            var args = token.Arguments;

            if (args.Length != 2)
            {
                throw new KarinException($"{Name}関数の引数の数が不正です。");
            }

            object ret = null;

            while (true)
            {
                object loop = engine.Ride(args[0]);
                if (!(loop is bool))
                {
                    throw new KarinException($"{Name}関数の条件を評価できません。");
                }
                if ((bool)loop == false)
                {
                    break;
                }

                ret = engine.Ride(args[1]);
                if (ret is ReturnedObject)
                {
                    break;
                }
            }
            return(ret);
        }
Beispiel #4
0
        public object Execute(KarinEngine engine, FunctionToken token, object pipedObj)
        {
            if (!((token.IsPipe && token.Arguments.Length == 0) ||
                  (!token.IsPipe && token.Arguments.Length == 1)))
            {
                throw new KarinException($"{Name}関数の引数の数が不正です。");
            }

            var arg = token.IsPipe ? pipedObj : engine.Ride(token.Arguments[0]);

            if (!(arg is string))
            {
                throw new KarinException($"{Name}関数の引数が文字列ではありません。");
            }

            var s   = (string)arg;
            var sb  = new StringBuilder(s.Length);
            int pre = 0;
            var ptn = new Regex(@"{\s*(\$\$?[^\s\$\{\}]+)\s*}");

            foreach (Match m in ptn.Matches(s))
            {
                var val = engine.Eval(m.Value);
                sb.Append(s.Substring(pre, m.Index - pre));
                sb.Append(val);
                pre = m.Index + m.Length;
            }
            sb.Append(s.Substring(pre, s.Length - pre));
            return(sb.ToString());
        }
Beispiel #5
0
        public object Execute(KarinEngine engine, FunctionToken token, object pipedObj)
        {
            if (!((token.IsPipe && token.Arguments.Length == 0) ||
                  (!token.IsPipe && token.Arguments.Length == 1)))
            {
                throw new KarinException($"{Name}関数の引数の数が不正です。");
            }

            var s = token.IsPipe ? pipedObj : engine.Ride(token.Arguments[0]);

            if (!(s is string))
            {
                throw new KarinException($"構文関数'{token.Name}'を実行できません。");
            }
            return(engine.Eval((string)s));
        }