Exemple #1
0
        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);
        }
Exemple #2
0
        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());
            }
        }
Exemple #3
0
        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");
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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());
        }
Exemple #6
0
        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");
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
 public abstract Value Evaluate(NSIterator iterator, Lambda lambda);
Exemple #11
0
        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);
        }
Exemple #12
0
        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);
        }