Ejemplo n.º 1
0
 public void Constant(string name, Value value)
 {
     builder.Define(name, readOnly: true);
     builder.Variable(name);
     builder.Assign();
     builder.Value(value);
     builder.End();
 }
Ejemplo n.º 2
0
        public static Lambda Id()
        {
            var builder = new CodeBuilder();

            builder.Parameter("$0");
            builder.Variable("$0");
            return(builder.Lambda());
        }
Ejemplo n.º 3
0
        public static Lambda AddOne()
        {
            var builder = new CodeBuilder();

            builder.Parameter("$0");
            builder.Variable("$0");
            builder.Operator("+");
            builder.Value(1);
            return(builder.Lambda());
        }
Ejemplo n.º 4
0
        void createSourceBlock()
        {
            var asAdded = block.AsAdded;
            var incrementerToBeCreated = true;

            for (var i = 0; i < block.Count; i++)
            {
                var verb = asAdded[i];
                if (FunctionInvoke(block, ref i, out var variableName, out var arguments))
                {
                    if (variableName == functionName)
                    {
                        if (incrementerToBeCreated)
                        {
                            var blocks = arguments.Blocks;
                            var length = blocks.Length;
                            var index  = 0;
                            foreach (var item in allParameterData.TakeWhile(item => index < length))
                            {
                                item.Value.Incrementer = blocks[index++];
                                item.Value.Incrementer.AutoRegister = false;
                            }

                            builder.Variable(functionName);
                            incrementerToBeCreated = false;
                        }
                        else
                        {
                            builder.Variable(variableName);
                        }
                    }
                    else
                    {
                        builder.Verb(verb);
                    }
                }
Ejemplo n.º 5
0
        public static Arguments FromValue(Value value, bool returnNullIfNotExecutable = true)
        {
            value = value.Self;
            if (value is OTuple tuple)
            {
                Assert(tuple.Length > 1, LOCATION, "Tuple must have at least two values");
                var innerValue = tuple[0];
                if (tuple[1] is Lambda innerLambda)
                {
                    return(new Arguments(innerValue, innerLambda.Block, innerLambda.Parameters));
                }

                Throw(LOCATION, "Second value must be a lambda");
            }

            if (value is MessagePath chain)
            {
                var builder = new CodeBuilder();
                builder.Variable(State.DefaultParameterNames.ValueVariable);
                builder.Apply();
                builder.Value(chain);
                var block = builder.Block;
                return(new Arguments(new NullBlock(), block));
            }

            if (value is Lambda lambda)
            {
                return new Arguments(new NullBlock(), lambda.Block, lambda.Parameters)
                       {
                           Splatting = lambda.Splatting
                       }
            }
            ;

            if (value is Block aBlock)
            {
                return(new Arguments(new NullBlock(), aBlock, new NullParameters()));
            }
            if (returnNullIfNotExecutable)
            {
                return(null);
            }

            var argumentsBlock = PushValue(value);

            return(new Arguments(argumentsBlock));
        }
Ejemplo n.º 6
0
        public static Arguments FromValue(Value value, bool returnNullIfNotExecutable = true)
        {
            value = value.Self;
            switch (value)
            {
            case OTuple tuple:
            {
                tuple.Values.Must().HaveLengthOf(2).OrThrow(LOCATION, () => "Tuple must have at least two values");
                var innerValue = tuple[0];
                if (tuple[1] is Lambda innerLambda)
                {
                    return(new Arguments(innerValue, innerLambda.Block, innerLambda.Parameters));
                }

                throw LOCATION.ThrowsWithLocation(() => "Second value must be a lambda");
            }

            case MessagePath chain:
            {
                var builder = new CodeBuilder();
                builder.Variable(State.DefaultParameterNames.ValueVariable);
                builder.Apply();
                builder.Value(chain);
                var block = builder.Block;
                return(new Arguments(new NullBlock(), block));
            }

            case Lambda lambda:
                return(new Arguments(new NullBlock(), lambda.Block, lambda.Parameters)
                {
                    Splatting = lambda.Splatting
                });

            case Block aBlock:
                return(new Arguments(new NullBlock(), aBlock, new NullParameters()));
            }

            if (returnNullIfNotExecutable)
            {
                return(null);
            }

            var argumentsBlock = PushValue(value);

            return(new Arguments(argumentsBlock));
        }
Ejemplo n.º 7
0
        static void createVariable(List <Parameter> parameterList, CodeBuilder builder, int index)
        {
            builder.Variable(mangledVariableName(index));
            var count = parameterList.Count;

            if (index < count)
            {
                return;
            }

            var stack = new Stack <Parameter>();

            for (var i = index; i >= count; i--)
            {
                stack.Push(new Parameter(mangledVariableName(i)));
            }
            while (stack.Count > 0)
            {
                parameterList.Add(stack.Pop());
            }
        }