public Value Evaluate(Environment environment) { var result = new ValueList(); var localEnv = environment.NewEnv(); var list = AsList.From(listExpr.Evaluate(environment)); foreach (var listValue in list.GetValue()) { localEnv.Put(identifier, listValue); var value = valueExpr.Evaluate(localEnv); if (conditionExpr != null) { var condition = conditionExpr.Evaluate(localEnv); if (!condition.IsBoolean()) { throw new ControlErrorException(new ValueString("ERROR"), "Condition must be boolean but got " + condition.Type(), pos); } if (condition.AsBoolean().GetValue()) { result.AddItem(value); } } else { result.AddItem(value); } } return(result); }
public void SetArgs(List <string> names, List <Value> values) { var rest = new ValueList(); for (var i = 0; i < values.Count; i++) { if (names[i] != null) { if (!argNames.Contains(names[i])) { throw new ControlErrorException(new ValueString("ERROR"), "Argument " + names[i] + " is unknown", pos); } args[names[i]] = values[i]; } } var inKeywords = false; for (var i = 0; i < values.Count; i++) { if (names[i] == null) { if (inKeywords) { throw new ControlErrorException(new ValueString("ERROR"), "Positional arguments need to be placed before named arguments", pos); } var argName = GetNextPositionalArgName(); if (argName == null) { if (restArgName == null) { throw new ControlErrorException(new ValueString("ERROR"), "Too many arguments", pos); } rest.AddItem(values[i]); } else if (!args.ContainsKey(argName)) { args[argName] = values[i]; } else { rest.AddItem(values[i]); } } else { inKeywords = true; if (!argNames.Contains(names[i])) { throw new ControlErrorException(new ValueString("ERROR"), "Argument " + names[i] + " is unknown", pos); } args[names[i]] = values[i]; } } if (restArgName != null) { args[restArgName] = rest; } }
public Value Evaluate(Environment environment) { var result = new ValueList(); var localEnv = environment.NewEnv(); var list1 = AsList.From(listExpr1.Evaluate(environment), what1).GetValue(); var list2 = AsList.From(listExpr2.Evaluate(environment), what2).GetValue(); for (var i = 0; i < Math.Max(list1.Count, list2.Count); i++) { localEnv.Put(identifier1, i < list1.Count ? list1[i] : ValueNull.NULL); localEnv.Put(identifier2, i < list2.Count ? list2[i] : ValueNull.NULL); var value = valueExpr.Evaluate(localEnv); if (conditionExpr != null) { var condition = conditionExpr.Evaluate(localEnv); if (!condition.IsBoolean()) { throw new ControlErrorException(new ValueString("ERROR"), "Condition must be boolean but got " + condition.Type(), pos); } if (condition.AsBoolean().GetValue()) { result.AddItem(value); } } else { result.AddItem(value); } } return(result); }
public override Value Execute(Args args, Environment environment, SourcePos pos) { var result = new ValueList(); if (!args.HasArg("module")) { foreach (var symbol in environment.GetSymbols()) { result.AddItem(new ValueString(symbol)); } } else { var moduleArg = args.Get("module"); Dictionary <string, Value> module; if (moduleArg.IsString()) { module = environment.Get(moduleArg.AsString().GetValue(), pos).AsObject().value; } else { module = args.Get("module").AsObject().value; } foreach (var symbol in module.Keys) { result.AddItem(new ValueString(symbol)); } } return(result); }
public override Value Execute(Args args, Environment environment, SourcePos pos) { if (args.IsNull("lst")) { return(ValueNull.NULL); } var value = args.GetList("lst").GetValue(); var start = (int)args.GetInt("startidx").GetValue(); if (start < 0) { start = value.Count + start; } if (start > value.Count) { return(new ValueList()); } var end = (int)args.GetInt("endidx", value.Count).GetValue(); if (end < 0) { end = value.Count + end; } if (end > value.Count) { end = value.Count; } var result = new ValueList(); for (var i = start; i < end; i++) { result.AddItem(value[i]); } return(result); }
public override Value Execute(Args args, Environment environment, SourcePos pos) { if (args.IsNull("lst")) { return(ValueNull.NULL); } var lst = args.GetList("lst").GetValue(); var result = new ValueList(); for (var i = 0; i < lst.Count - 1; i++) { var pair = new ValueList(); pair.AddItem(lst[i]); pair.AddItem(lst[i + 1]); result.AddItem(pair); } return(result); }
public override ValueList AsList() { var result = new ValueList(); foreach (var item in value) { result.AddItem(item); } return(result); }
public override Value Execute(Args args, Environment environment, SourcePos pos) { var start = 0; var end = 0; var step = 1; if (args.HasArg("a") && !args.HasArg("b")) { end = (int)args.GetInt("a").GetValue(); } else if (args.HasArg("a") && args.HasArg("b")) { start = (int)args.GetInt("a").GetValue(); end = (int)args.GetInt("b").GetValue(); } if (args.HasArg("step")) { step = (int)args.GetInt("step").GetValue(); } var result = new ValueList(); var i = start; if (step > 0) { while (i < end) { result.AddItem(new ValueInt(i)); i += step; } } else if (step < 0) { while (i > end) { result.AddItem(new ValueInt(i)); i += step; } } return(result); }
public Value Evaluate(Environment environment) { var result = new ValueList(); foreach (var item in items) { if (item is NodeSpread) { var list = item.Evaluate(environment).AsList(); foreach (var value in list.GetValue()) { result.AddItem(value); } } else { result.AddItem(item.Evaluate(environment)); } } return(result); }
private void CollectFiles(string dir, bool recursive, bool include_path, bool include_dirs, ValueList result) { var files = Directory.EnumerateFileSystemEntries(dir); foreach (var file in files) { var isDir = (File.GetAttributes(file) & FileAttributes.Directory) != 0; if (include_dirs || !isDir) { result.AddItem(new ValueString(include_path ? file : Path.GetFileName(file))); } if (recursive && isDir) { CollectFiles(file, recursive, include_path, include_dirs, result); } } }
public Value Evaluate(Environment environment) { var result = new ValueMap(); var localEnv = environment.NewEnv(); var list = listExpr.Evaluate(environment); if (list.IsString()) { var s = list.AsString().GetValue(); var slist = new ValueList(); for (var i = 0; i < s.Length; i++) { slist.AddItem(new ValueString(s.Substring(i, 1))); } list = slist; } foreach (var listValue in list.AsList().GetValue()) { localEnv.Put(identifier, listValue); var key = keyExpr.Evaluate(localEnv); var value = valueExpr.Evaluate(localEnv); if (conditionExpr != null) { var condition = conditionExpr.Evaluate(localEnv); if (!condition.IsBoolean()) { throw new ControlErrorException(new ValueString("ERROR"), "Condition must be boolean but got " + condition.Type(), pos); } if (condition.AsBoolean().GetValue()) { result.AddItem(key, value); } } else { result.AddItem(key, value); } } return(result); }
public Value Evaluate(Environment environment) { Value value = this.expression.Evaluate(environment); Value start = this.start.Evaluate(environment); Value end = this.end != null?this.end.Evaluate(environment) : null; if (value == ValueNull.NULL) { return(ValueNull.NULL); } if (value.IsString()) { var s = value.AsString().GetValue(); int idxStart = (int)start.AsInt().GetValue(); int idxEnd = end == null ? s.Length : (int)end.AsInt().GetValue(); if (idxStart < 0) { idxStart = idxStart + s.Length; } if (idxEnd < 0) { idxEnd = idxEnd + s.Length; } if (idxStart < 0) { idxStart = 0; } if (idxEnd > s.Length) { idxEnd = s.Length; } return(new ValueString(s.Substring(idxStart, idxEnd - idxStart))); } if (value.IsList()) { var list = value.AsList().GetValue(); int idxStart = (int)start.AsInt().GetValue(); int idxEnd = end == null ? list.Count : (int)end.AsInt().GetValue(); if (idxStart < 0) { idxStart = idxStart + list.Count; } if (idxEnd < 0) { idxEnd = idxEnd + list.Count; } if (idxStart < 0) { idxStart = 0; } if (idxEnd > list.Count) { idxEnd = list.Count; } var result = new ValueList(); for (int i = idxStart; i < idxEnd; i++) { result.AddItem(list[i]); } return(result); } throw new ControlErrorException(new ValueString("ERROR"), "Cannot slice value " + value, this.pos); }
private static Value Parse(Lexer lexer) { try { var token = lexer.NextToken(); if (token == "[") { var result = new ValueList(); var next = lexer.NextToken(); while (next != "]") { lexer.PutBackToken(next); result.AddItem(Parse(lexer)); next = lexer.NextToken(); if (next != "]") { lexer.PutBackToken(next); lexer.MatchToken(","); next = lexer.NextToken(); } } return(result); } if (token == "{") { var result = new ValueMap(); var next = lexer.NextToken(); while (next != "}") { lexer.PutBackToken(next); var key = lexer.NextToken(); if (!key.StartsWith("\"")) { throw new Exception("Expected object key, but got " + key); } key = key.Substring(1, key.Length - 2); lexer.MatchToken(":"); result.AddItem(new ValueString(key), Parse(lexer)); next = lexer.NextToken(); if (next != "}") { lexer.PutBackToken(next); lexer.MatchToken(","); next = lexer.NextToken(); } } return(result); } if (token.StartsWith("\"")) { return(new ValueString(token.Substring(1, token.Length - 2))); } if (token == "true" || token == "false") { return(ValueBoolean.From(bool.Parse(token))); } if (token == "null") { return(ValueNull.NULL); } if (token.IndexOf('.') == -1) { return(new ValueInt(long.Parse(token))); } return(new ValueDecimal(decimal.Parse(token))); } catch (Exception) { return(null); } }
public override Value Execute(Args args, Environment environment, SourcePos pos) { var a = args.Get("a"); var b = args.Get("b"); if (a.IsNull() || b.IsNull()) { return(ValueNull.NULL); } if (a.IsInt() && b.IsInt()) { return(new ValueInt(a.AsInt().GetValue() - b.AsInt().GetValue())); } if (a.IsNumerical() && b.IsNumerical()) { return(new ValueDecimal(a.AsDecimal().GetValue() - b.AsDecimal().GetValue())); } if (a.IsDate()) { if (b.IsDate()) { return(new ValueInt(a.AsDate().GetValue().Subtract(b.AsDate().GetValue()).Days)); } return(new ValueDate(a.AsDate().GetValue() - TimeSpan.FromDays((double)args.GetAsDecimal("b").GetValue()))); } if (a.IsList()) { var result = new ValueList(); foreach (var item in a.AsList().GetValue()) { var add = true; foreach (var val in args.GetAsList("b").GetValue()) { if (!item.IsEquals(val)) { continue; } add = false; break; } if (add) { result.AddItem(item); } } return(result); } if (a.IsSet()) { var result = new ValueSet(); var minus = new SortedSet <Value>(new ComparerValue()); if (b.IsSet()) { minus = new SortedSet <Value>(b.AsSet().GetValue(), new ComparerValue()); } else if (b.IsList()) { foreach (var element in b.AsList().GetValue()) { minus.Add(element); } } else { minus.Add(b); } foreach (var element in a.AsSet().GetValue()) { if (!minus.Contains(element)) { result.AddItem(element); } } return(result); } throw new ControlErrorException(new ValueString("ERROR"), "Cannot subtract " + b + " from " + a, pos); }
public Value Evaluate(Environment environment) { var list = expression.Evaluate(environment); if (list.IsInput()) { var input = list.AsInput(); Value result = ValueBoolean.TRUE; string line = null; try { line = input.ReadLine(); while (line != null) { var value = new ValueString(line); if (identifiers.Count == 1) { environment.Put(identifiers[0], value); } else { var vals = value.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } line = input.ReadLine(); } if (identifiers.Count == 1) { environment.Remove(identifiers[0]); } else { for (var i = 0; i < identifiers.Count; i++) { environment.Remove(identifiers[i]); } } } catch (IOException) { throw new ControlErrorException(new ValueString("ERROR"), "Cannot read from input", pos); } return(result); } if (list.IsList()) { Value result = ValueBoolean.TRUE; foreach (var value in list.AsList().GetValue()) { if (identifiers.Count == 1) { environment.Put(identifiers[0], value); } else { var vals = value.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } if (identifiers.Count == 1) { environment.Remove(identifiers[0]); } else { for (var i = 0; i < identifiers.Count; i++) { environment.Remove(identifiers[i]); } } return(result); } if (list.IsSet()) { Value result = ValueBoolean.TRUE; foreach (var value in list.AsSet().GetValue()) { if (identifiers.Count == 1) { environment.Put(identifiers[0], value); } else { var vals = value.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } if (identifiers.Count == 1) { environment.Remove(identifiers[0]); } else { for (var i = 0; i < identifiers.Count; i++) { environment.Remove(identifiers[i]); } } return(result); } if (list.IsMap()) { Value result = ValueBoolean.TRUE; if (what == "keys") { foreach (var val in list.AsMap().GetValue().Keys.ToList()) { if (identifiers.Count == 1) { environment.Put(identifiers[0], val); } else { var vals = val.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } } else if (what == "values") { foreach (var val in list.AsMap().GetValue().Values.ToList()) { if (identifiers.Count == 1) { environment.Put(identifiers[0], val); } else { var vals = val.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } } else if (what == "entries") { foreach (var entry in list.AsMap().GetValue().ToList()) { ValueList val = new ValueList(); val.AddItem(entry.Key); val.AddItem(entry.Value); if (identifiers.Count == 1) { environment.Put(identifiers[0], val); } else { var vals = val.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } } if (identifiers.Count == 1) { environment.Remove(identifiers[0]); } else { for (var i = 0; i < identifiers.Count; i++) { environment.Remove(identifiers[i]); } } return(result); } if (list.IsObject()) { Value result = ValueBoolean.TRUE; if (what == "keys") { foreach (var key in list.AsObject().value.Keys.ToList()) { Value val = new ValueString(key); environment.Put(identifiers[0], val); result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } } else if (what == "values") { foreach (var val in list.AsObject().value.Values.ToList()) { if (identifiers.Count == 1) { environment.Put(identifiers[0], val); } else { var vals = val.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } } else if (what == "entries") { foreach (var entry in list.AsObject().value.ToList()) { var val = new ValueList(); val.AddItem(new ValueString(entry.Key)); val.AddItem(entry.Value); if (identifiers.Count == 1) { environment.Put(identifiers[0], val); } else { var vals = val.AsList().GetValue(); for (int i = 0; i < identifiers.Count; i++) { environment.Put(identifiers[i], vals[i]); } } result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } } if (identifiers.Count == 1) { environment.Remove(identifiers[0]); } else { for (var i = 0; i < identifiers.Count; i++) { environment.Remove(identifiers[i]); } } return(result); } if (list.IsString()) { var str = list.AsString().GetValue(); Value result = ValueBoolean.TRUE; foreach (var value in str) { environment.Put(identifiers[0], new ValueString(value.ToString())); result = block.Evaluate(environment); if (result.IsBreak()) { result = ValueBoolean.TRUE; break; } if (result.IsContinue()) { result = ValueBoolean.TRUE; // continue } if (result.IsReturn()) { break; } } environment.Remove(identifiers[0]); return(result); } throw new ControlErrorException(new ValueString("ERROR"), "Cannot iterate over " + list, pos); }
public override Value Execute(Args args, Environment environment, SourcePos pos) { var a = args.Get("a"); var b = args.Get("b"); if (a.IsNull() || b.IsNull()) { return(ValueNull.NULL); } if (a.IsInt() && b.IsInt()) { return(new ValueInt(a.AsInt().GetValue() + b.AsInt().GetValue())); } if (a.IsNumerical() && b.IsNumerical()) { return(new ValueDecimal(a.AsDecimal().GetValue() + b.AsDecimal().GetValue())); } if (a.IsList()) { if (b.IsCollection()) { return(new ValueList(a.AsList().GetValue()).AddItems(b.AsList().GetValue())); } return(new ValueList(a.AsList().GetValue()).AddItem(b)); } if (a.IsDate() && b.IsNumerical()) { return(new ValueDate(a.AsDate().GetValue() + TimeSpan.FromDays((double)args.GetAsDecimal("b").GetValue()))); } if (a.IsSet()) { if (b.IsCollection()) { return(new ValueSet(a.AsSet().GetValue()).AddItems(b.AsSet().GetValue())); } return(new ValueSet(a.AsSet().GetValue()).AddItem(b)); } if (b.IsList()) { var result = new ValueList(); result.AddItem(a); result.AddItems(b.AsList().GetValue()); return(result); } if (b.IsSet()) { var result = new ValueSet(); result.AddItem(a); result.AddItems(b.AsSet().GetValue()); return(result); } if (a.IsString() && b.IsAtomic() || a.IsAtomic() && b.IsString()) { return(new ValueString(a.AsString().GetValue() + b.AsString().GetValue())); } throw new ControlErrorException(new ValueString("ERROR"), "Cannot add " + a + " and " + b, pos); }