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); }
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); } }
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); }
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()); }
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)); }