public override Value Evaluate(NSIterator iterator, Lambda lambda) { var found = false; iterator.Reset(); var value = iterator.Next(); for (var i = 0; !value.IsNil && i < MAX_LOOP; i++) { var result = lambda.Invoke(new Arguments(value)); if (result.IsTrue) { if (found) { return(false); } found = true; } value = iterator.Next(); } return(found); }
public virtual Value EvaluateAsLambda(NSIterator iterator, Parameters parameters, Block block) { using (var popper = new RegionPopper(new Region(), "any-of")) { popper.Push(); for (var i = 0; i < MAX_LOOP; i++) { var current = iterator.Next(); if (current.IsNil) { return(IfNil()); } parameters.SetValues(current, i); if (BlockCompare(block)) { var success = Success(); if (success.IsSome) { return(success.Value); } } } return(Final()); } }
public static string Iterate(INSGenerator generator, Parameters parameters, Block block) { var iterator = new NSIterator(generator); var index = 0; using var popper = new RegionPopper(new Region(), "for"); popper.Push(); iterator.Reset(); for (var i = 0; i < MAX_LOOP; i++) { index = i; var next = iterator.Next(); if (next.IsNil) { break; } parameters.SetValues(next, i); block.Evaluate(); var signal = Signal(); if (signal == Breaking || signal == ReturningNull) { break; } } return(index == 1 ? "1 iteration" : $"{index} iterations"); }
public override Value Evaluate() { var stack = State.Stack; var right = stack.Pop(true, LOCATION); var left = stack.Pop(true, LOCATION); var leftGenerator = left.PossibleGenerator().Must().HaveValue().Force(LOCATION, () => $"{left} is not a generator"); var rightGenerator = right.PossibleGenerator().Must().HaveValue().Force(LOCATION, () => $"{right} is not a generator"); var leftIterator = new NSIterator(leftGenerator); var rightIterator = new NSIterator(rightGenerator); var outerArray = new Array(); var outerValue = leftIterator.Next(); for (var i = 0; !outerValue.IsNil && i < MAX_ARRAY; i++) { rightIterator.Reset(); var innerValue = rightIterator.Next(); for (var j = 0; !innerValue.IsNil && j < MAX_ARRAY; j++) { var innerArray = new Array { outerValue, innerValue }; outerArray.Add(modifyInnerArray(innerArray)); innerValue = rightIterator.Next(); } outerValue = leftIterator.Next(); } return(outerArray); }
public virtual Value Evaluate() { var value = arguments[0]; var iterator = new NSIterator(generator); iterator.Reset(); var block = arguments.Executable; if (block != null && block.Count > 0) { return(EvaluateAsLambda(iterator, arguments.Parameters, block)); } for (var i = 0; i < MAX_LOOP; i++) { var current = iterator.Next(); if (current.IsNil) { return(IfNil()); } if (Compare(current, value)) { var success = Success(); if (success.IsSome) { return(success.Value); } } } return(Final()); }
static Array FromFields(INSGenerator generator, Parameters parameters, bool readOnly, bool setting, bool overriding, Func <Value, Value> map) { var iterator = new NSIterator(generator); var array = new Array(); var start = 0; var actualParameters = parameters.GetParameters(); var length = actualParameters.Length; var assignments = new Hash <string, Value>(); var assignedParameters = new Hash <string, Parameter>(); for (var i = start; i < length; i++) { start = i; var parameter = actualParameters[i]; var value = iterator.Next(); if (value.IsNil) { break; } assignments[parameter.Name] = value; assignedParameters[parameter.Name] = parameter; array[parameter.Name] = value; } if (start <= length - 1) { var innerArray = new Array { array[parameters[start].Name] }; for (var i = start; i < MAX_LOOP; i++) { var value = iterator.Next(); if (value.IsNil) { break; } innerArray.Add(value); } if (innerArray.Length > 0) { var value = map(innerArray); assignments[parameters[start].Name] = value; assignedParameters[parameters[start].Name] = parameters[start]; array[parameters[start].Name] = value; } } foreach (var(key, value) in assignments) { if (assignedParameters.If(key, out var parameter)) { parameter.Assign(value, readOnly, setting, overriding); } } return(array); }
public override Value Evaluate() { var stack = State.Stack; var right = stack.Pop(true, Location); var left = stack.Pop(true, Location); var generator = left.PossibleGenerator().Must().HaveValue().Force(Location, () => $"{left} is not a generator"); if (right is Lambda lambda) { var iterator = new NSIterator(generator); return(Evaluate(iterator, lambda)); } throw Location.ThrowsWithLocation(() => $"{right} is not a lambda"); }
public static Array ToArray(INSGenerator generator) { var array = new Array(); var iterator = new NSIterator(generator); iterator.Reset(); for (var i = 0; i < MAX_ARRAY; i++) { var next = iterator.Next(); if (next.IsNil) { break; } array.Add(next); } return(array); }
public override Value Evaluate() { var stack = State.Stack; var right = stack.Pop(true, Location); var left = stack.Pop(true, Location); var generator = left.PossibleGenerator(); Assert(generator.IsSome, Location, $"{left} is not a generator"); /* var lambda = right.As<Lambda>(); * Assert(lambda.IsSome, Location, $"{right} is not a lambda");*/ if (right is Lambda lambda) { var iterator = new NSIterator(generator.Value); return(Evaluate(iterator, lambda)); } Throw(Location, $"{right} is not a lamba"); return(null); }
public abstract Value Evaluate(NSIterator iterator, Lambda lambda);
public override Value Evaluate() { var value = expression.Evaluate(); typeName = value.Type.ToString(); var text = ""; switch (printType) { case PrintType.Print: text = ValueAsString(value); result = text; break; case PrintType.Manifest: text = ValueAsRep(value); result = text; break; case PrintType.Put: var anyGenerator = value.PossibleIndexGenerator(); if (anyGenerator.If(out var generator)) { var iterator = new NSIterator(generator); var builder = new StringBuilder(); while (true) { var next = iterator.Next(); if (next.IsNil) { break; } text = ValueAsString(next); State.ConsoleManager.Put(text); if (builder.Length != 0) { builder.Append(" "); } builder.Append(text); } result = builder.ToString(); } else { text = ValueAsString(value); result = text; State.ConsoleManager.Put(text); } return(null); } if (endLine) { State.ConsoleManager.ConsolePrintln(text); } else { State.ConsoleManager.ConsolePrint(text); } return(null); }
static Array FromFields(INSGenerator generator, Parameters parameters, bool readOnly, bool setting, bool _override, Func <Value, Value> map) { var iterator = new NSIterator(generator); var array = new Array(); var start = 0; var actuals = parameters.GetParameters(); var length = actuals.Length; var assignments = new Hash <string, Value>(); var assignedParameters = new Hash <string, Parameter>(); for (var i = start; i < length; i++) { start = i; var parameter = actuals[i]; var value = iterator.Next(); if (value.IsNil) { break; } assignments[parameter.Name] = value; assignedParameters[parameter.Name] = parameter; array[parameter.Name] = value; } if (start <= length - 1) { var innerArray = new Array { array[parameters[start].Name] }; for (var i = start; i < MAX_LOOP; i++) { var value = iterator.Next(); if (value.IsNil) { break; } innerArray.Add(value); } if (innerArray.Length > 0) { var value = map(innerArray); assignments[parameters[start].Name] = value; assignedParameters[parameters[start].Name] = parameters[start]; array[parameters[start].Name] = value; } } // ReSharper disable once LoopCanBePartlyConvertedToQuery foreach (var item in assignments) { if (assignedParameters.If(item.Key, out var parameter)) { parameter.Assign(item.Value, readOnly, setting, _override); } } return(array); }