diff options
| author | Bobby <[email protected]> | 2024-04-05 20:17:44 +0000 |
|---|---|---|
| committer | Bobby <[email protected]> | 2024-04-05 20:17:44 +0000 |
| commit | e7b7baba5e6485ae6e241eee4c3f30557afa0fa8 (patch) | |
| tree | f09be89602cefd9e2dc5102a6e11622753619c7a /evaluator/builtins.go | |
| parent | 77d0ea46b3f1de99357c7706c4c05eb44c237412 (diff) | |
| download | mana-e7b7baba5e6485ae6e241eee4c3f30557afa0fa8.tar.xz mana-e7b7baba5e6485ae6e241eee4c3f30557afa0fa8.zip | |
Added Built In Functions for Arrays
Diffstat (limited to 'evaluator/builtins.go')
| -rw-r--r-- | evaluator/builtins.go | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/evaluator/builtins.go b/evaluator/builtins.go index 0e6846a..1c7a312 100644 --- a/evaluator/builtins.go +++ b/evaluator/builtins.go @@ -15,9 +15,97 @@ var builtins = map[string]*object.Builtin{ switch arg := args[0].(type) { case *object.String: return &object.Integer{Value: int64(len(arg.Value))} + case *object.Array: + return &object.Integer{Value: int64(len(arg.Elements))} default: return newError("argument to `len` not supported, got %s", arg.Type()) } }, }, + "first": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 1 { + return newError("wrong number of arguments. got=%d, want=1", + len(args)) + } + + if args[0].Type() != object.ARRAY_OBJ { + return newError("argument to `first` must be ARRAY, got %s", + args[0].Type()) + } + + arr := args[0].(*object.Array) + if len(arr.Elements) > 0 { + return arr.Elements[0] + } + + return NULL + }, + }, + "last": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 1 { + return newError("wrong number of arguments. got=%d, want=1", + len(args)) + } + + if args[0].Type() != object.ARRAY_OBJ { + return newError("argument to `last` must be ARRAY, got %s", + args[0].Type()) + } + + arr := args[0].(*object.Array) + length := len(arr.Elements) + if length > 0 { + return arr.Elements[length-1] + } + + return NULL + }, + }, + "rest": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 1 { + return newError("wrong number of arguments. got=%d, want=1", + len(args)) + } + + if args[0].Type() != object.ARRAY_OBJ { + return newError("argument to `rest` must be ARRAY, got %s", + args[0].Type()) + } + + arr := args[0].(*object.Array) + length := len(arr.Elements) + if length > 0 { + newElements := make([]object.Object, length-1) + copy(newElements, arr.Elements[1:length]) + return &object.Array{Elements: newElements} + } + + return NULL + }, + }, + "push": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 2 { + return newError("wrong number of arguments. got=%d, want=2", + len(args)) + } + + if args[0].Type() != object.ARRAY_OBJ { + return newError("argument to `push` must be ARRAY, got %s", + args[0].Type()) + } + + arr := args[0].(*object.Array) + length := len(arr.Elements) + + newElements := make([]object.Object, length+1) + copy(newElements, arr.Elements) + newElements[length] = args[1] + + return &object.Array{Elements: newElements} + }, + }, } |
