public void Constant(string name, Value value) { builder.Define(name, readOnly: true); builder.Variable(name); builder.Assign(); builder.Value(value); builder.End(); }
public static Lambda Id() { var builder = new CodeBuilder(); builder.Parameter("$0"); builder.Variable("$0"); return(builder.Lambda()); }
public static Lambda AddOne() { var builder = new CodeBuilder(); builder.Parameter("$0"); builder.Variable("$0"); builder.Operator("+"); builder.Value(1); return(builder.Lambda()); }
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); } }
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)); }
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)); }
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()); } }