func stringsLength(context *runtime.FunctionCallContext) (*runtime.Value, error) { if err := runtime.ValidateArguments(context, runtime.StringValue); err != nil { return nil, err } return runtime.NewNumberValueFromInt64(int64(len(context.Args[0].Str))), nil }
func listSize(context *runtime.FunctionCallContext) (*runtime.Value, error) { if err := runtime.ValidateArguments(context, runtime.ListValue); err != nil { return nil, err } return runtime.NewNumberValueFromInt64(int64(len(context.Args[0].List))), nil }
func mathMod(context *runtime.FunctionCallContext) (*runtime.Value, error) { if err := runtime.ValidateArguments(context, runtime.NumberValue, runtime.NumberValue); err != nil { return nil, err } return runtime.NewNumberValueFromInt64(context.Args[0].NumberToInt64() % context.Args[1].NumberToInt64()), nil }
func builtinFor(context *runtime.MacroCallContext) (*runtime.Value, error) { l, err := context.Block.EvalNode(context.Nodes[0]) if err != nil { return nil, err } if l.Type != runtime.ListValue { return nil, runtime.NewRuntimeError(context.Nodes[0].Pos(), "expected a list to iterate over") } var args []string for _, nameNode := range context.Nodes[1].(*parser.ListNode).Nodes { ident, isIdent := nameNode.(*parser.IdentifierNode) if isIdent { args = append(args, ident.Token.Data) } else { return nil, runtime.NewRuntimeError(nameNode.Pos(), "expected an identifier") } } if len(args) > 2 { return nil, runtime.NewRuntimeError(context.Nodes[1].Pos(), "too many arguments provided") } callbackBlock := runtime.NewBlock([]parser.Node{context.Nodes[2]}, runtime.NewScope(context.Block.Scope)) for i, item := range l.List { if len(args) >= 1 { callbackBlock.Scope.SetSymbol(args[0], runtime.NewSymbol(item)) } if len(args) == 2 { callbackBlock.Scope.SetSymbol(args[1], runtime.NewSymbol(runtime.NewNumberValueFromInt64(int64(i)))) } _, err := callbackBlock.Eval() if err != nil { return nil, err } } return runtime.Nil, nil }
func listSeq(context *runtime.FunctionCallContext) (*runtime.Value, error) { if err := runtime.ValidateArguments(context, runtime.NumberValue, runtime.NumberValue); err != nil { return nil, err } low := context.Args[0].NumberToInt64() high := context.Args[1].NumberToInt64() if low > high { return nil, runtime.NewRuntimeError(context.Pos, "invalid argument(s), low can't be higher than high (%d > %d)", low, high) } l := runtime.NewListValue() for i := low; i <= high; i++ { l.List = append(l.List, runtime.NewNumberValueFromInt64(i)) } return l, nil }