public override Verb CreateVerb(string[] tokens) { var invokableName = tokens[2]; Color(position, tokens[1].Length, Whitespaces); Color(invokableName.Length, Invokeables); Color(tokens[3].Length, Structures); Color(tokens[4].Length, Whitespaces); AdvanceTabs(); var index = NextPosition; var arguments = new Arguments(); while (index < source.Length) { if (parser.Scan(source, index)) { index = parser.Position; var expression = (Block)parser.Value; arguments.AddBlockArgument(expression); } else { break; } } RegressTabs(); return(new FunctionInvoke(invokableName, arguments)); }
public override Verb CreateVerb(string[] tokens) { var hasPoint = tokens[1].Trim().IsNotEmpty(); var message = tokens[2]; Color(position, tokens[1].Length, Structures); Color(message.Length, Messaging); Color(1, Structures); return(GetExpression(source, NextPosition, CloseBracket(), true).Map((argumentExp, i) => { var index = i; var fieldName = ""; if (freeParser.Scan(source, index, $"^ {REGEX_ASSIGN}")) { index = freeParser.Position; freeParser.Colorize(Whitespaces, Structures, Structures); var op = freeParser.Tokens[2]; return GetExpression(source, index, EndOfLine()).Map((expression, j) => { overridePosition = j; if (!hasPoint) { fieldName = message; message = "item"; } if (op.IsNotEmpty()) { var combined = CombineOperation(message, op, argumentExp, expression); if (combined.IsNone) { return null; } expression = combined.Value; } var arguments = new Arguments(); arguments.AddBlockArgument(argumentExp); arguments.AddBlockArgument(expression); return hasPoint ? new SendMessage(SetterName(message), arguments) : new SendMessageToField(fieldName, SetterName(message), arguments); }, () => null); } overridePosition = index; return new SendMessage(GetterName(message), new Arguments(argumentExp)); }, () => null)); }