예제 #1
0
 public void Constant(string name, Value value)
 {
     builder.Define(name, readOnly: true);
     builder.Variable(name);
     builder.Assign();
     builder.Value(value);
     builder.End();
 }
예제 #2
0
        public static Lambda AddOne()
        {
            var builder = new CodeBuilder();

            builder.Parameter("$0");
            builder.Variable("$0");
            builder.Operator("+");
            builder.Value(1);
            return(builder.Lambda());
        }
예제 #3
0
        public void ReturnValueFunction(string functionName, Value value, VisibilityType visibility =
                                        Public, bool _override = false, bool global = false, bool autoInvoke = false)
        {
            var inner = new CodeBuilder();

            inner.Value(value);
            var lambda = inner.Lambda();

            Function(functionName, lambda, false, visibility, _override, global);
        }
예제 #4
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));
        }
예제 #5
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));
        }