diff --git a/src/array.go b/src/array.go index b04c021..cde4228 100644 --- a/src/array.go +++ b/src/array.go @@ -23,7 +23,6 @@ func ArArray(arr []any) ArObject { anymap{ "__name__": "array", "__value__": arr, - "length": newNumber().SetUint64(uint64(len(arr))), }, } val.obj["__setindex__"] = builtinFunc{ @@ -68,9 +67,19 @@ func ArArray(arr []any) ArObject { // a[0] is start // a[1] is end // a[2] is step - if len(a) > 3 { + if len(a) > 3 || len(a) == 0 { return nil, ArErr{"Type Error", "expected 1 to 3 arguments, got " + fmt.Sprint(len(a)), 0, "", "", true} } + { + if len(a) == 1 { + if typeof(a[0]) == "string" { + var name = ArValidToAny(a[0]).(string) + if name == "length" { + return newNumber().SetInt64(int64(len(arr))), ArErr{} + } + } + } + } var ( start int = 0 end any = nil @@ -183,7 +192,6 @@ func ArArray(arr []any) ArObject { } } arr = append(arr[:num], arr[num+1:]...) - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return nil, ArErr{} }} @@ -198,7 +206,6 @@ func ArArray(arr []any) ArObject { } } arr = append(arr, args...) - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return nil, ArErr{} }, @@ -236,7 +243,6 @@ func ArArray(arr []any) ArObject { } } arr = append(arr[:num], append(args[1:], arr[num:]...)...) - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return nil, ArErr{} }, @@ -276,13 +282,11 @@ func ArArray(arr []any) ArObject { } v := arr[num] arr = append(arr[:num], arr[num+1:]...) - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return v, ArErr{} } v := arr[len(arr)-1] arr = arr[:len(arr)-1] - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return v, ArErr{} }, @@ -298,7 +302,6 @@ func ArArray(arr []any) ArObject { } } arr = []any{} - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return nil, ArErr{} }, @@ -321,7 +324,6 @@ func ArArray(arr []any) ArObject { } } arr = append(arr, args[0].(ArObject).obj["__value__"].([]any)...) - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return nil, ArErr{} }, @@ -370,7 +372,6 @@ func ArArray(arr []any) ArObject { } } arr = output - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return nil, ArErr{} } @@ -386,7 +387,6 @@ func ArArray(arr []any) ArObject { } } arr = output - val.obj["length"] = newNumber().SetUint64(uint64(len(arr))) val.obj["__value__"] = arr return nil, ArErr{} }, diff --git a/src/buffer.go b/src/buffer.go index d61d778..9538de5 100644 --- a/src/buffer.go +++ b/src/buffer.go @@ -86,7 +86,6 @@ func ArBuffer(buf []byte) ArObject { obj: anymap{ "__name__": "buffer", "__value__": buf, - "length": newNumber().SetInt64(int64(len(buf))), }, } obj.obj["__string__"] = builtinFunc{ @@ -147,7 +146,6 @@ func ArBuffer(buf []byte) ArObject { } } obj.obj["__value__"] = buf - obj.obj["length"] = newNumber().SetInt64(int64(len(buf))) return obj, ArErr{} }, } @@ -390,7 +388,6 @@ func ArBuffer(buf []byte) ArObject { } } obj.obj["__value__"] = buf - obj.obj["length"] = newNumber().SetInt64(int64(len(buf))) return obj, ArErr{} }, } @@ -464,10 +461,56 @@ func ArBuffer(buf []byte) ArObject { } } obj.obj["__value__"] = buf - obj.obj["length"] = newNumber().SetInt64(int64(len(buf))) return obj, ArErr{} }, } + obj.obj["__getindex__"] = builtinFunc{ + "__getindex__", + func(a ...any) (any, ArErr) { + if len(a) != 1 { + return nil, ArErr{ + TYPE: "Type Error", + message: "expected 1 argument, got " + fmt.Sprint(len(a)), + EXISTS: true, + } + } + { + if len(a) == 1 { + if typeof(a[0]) == "string" { + var name = ArValidToAny(a[0]).(string) + if name == "length" { + return newNumber().SetInt64(int64(len(buf))), ArErr{} + } + } + } + } + poss := ArValidToAny(a[0]) + if typeof(poss) != "number" { + return nil, ArErr{ + TYPE: "Type Error", + message: "expected number, got " + typeof(poss), + EXISTS: true, + } + } + pos := poss.(number) + if pos.Denom().Cmp(one.Denom()) != 0 { + return nil, ArErr{ + TYPE: "Type Error", + message: "position must be an integer", + EXISTS: true, + } + } + posNum := pos.Num().Int64() + if posNum < 0 || posNum >= int64(len(buf)) { + return nil, ArErr{ + TYPE: "Index Error", + message: "index out of range", + EXISTS: true, + } + } + return ArByte(buf[posNum]), ArErr{} + }, + } obj.obj["remove"] = builtinFunc{ "remove", func(a ...any) (any, ArErr) { @@ -497,7 +540,6 @@ func ArBuffer(buf []byte) ArObject { posNum := pos.Num().Int64() buf = append(buf[:posNum], buf[posNum+1:]...) obj.obj["__value__"] = buf - obj.obj["length"] = newNumber().SetInt64(int64(len(buf))) return obj, ArErr{} }, } diff --git a/src/main.go b/src/main.go index 47dac1d..0907909 100644 --- a/src/main.go +++ b/src/main.go @@ -10,8 +10,8 @@ var Args = os.Args[1:] type stack = []ArObject -const VERSION = "3.0.7" -const VERSION_NUM = 5 +const VERSION = "3.0.8a" +const VERSION_NUM = 6 func newscope() ArObject { return Map(anymap{}) diff --git a/src/map.go b/src/map.go index f272b82..43e0c92 100644 --- a/src/map.go +++ b/src/map.go @@ -273,6 +273,54 @@ func Map(m anymap) ArObject { return nil, ArErr{} }, }, + "__deleteindex__": builtinFunc{ + "__deleteindex__", + func(args ...any) (any, ArErr) { + if len(args) != 1 { + return nil, ArErr{ + TYPE: "Type Error", + message: "expected 1 argument, got " + fmt.Sprint(len(args)), + EXISTS: true, + } + } + if isUnhashable(args[0]) { + return nil, ArErr{ + TYPE: "Runtime Error", + message: "unhashable type: " + typeof(args[0]), + EXISTS: true, + } + } + key := ArValidToAny(args[0]) + mutex.RLock() + if _, ok := m[key]; !ok { + mutex.RUnlock() + return nil, ArErr{ + TYPE: "KeyError", + message: "key " + fmt.Sprint(key) + " not found", + EXISTS: true, + } + } + mutex.RUnlock() + listenersMutex.RLock() + if _, ok := listeners[key]; ok { + for _, v := range listeners[key] { + runCall( + call{ + Callable: v, + Args: []any{}, + }, + stack{}, + 0, + ) + } + } + listenersMutex.RUnlock() + mutex.Lock() + delete(m, key) + mutex.Unlock() + return nil, ArErr{} + }, + }, "__getindex__": builtinFunc{ "__getindex__", func(args ...any) (any, ArErr) { @@ -457,6 +505,7 @@ func Map(m anymap) ArObject { return ArArray(keys), ArErr{} }, } + obj.obj["__Boolean__"] = builtinFunc{ "__Boolean__", func(args ...any) (any, ArErr) { diff --git a/src/string.go b/src/string.go index c924808..11e785e 100644 --- a/src/string.go +++ b/src/string.go @@ -65,7 +65,6 @@ func ArString(str string) ArObject { anymap{ "__value__": str, "__name__": "string", - "length": newNumber().SetUint64(uint64(len(str))), }, } @@ -96,7 +95,6 @@ func ArString(str string) ArObject { } str = strings.Join([]string{str[:index], a[1].(string), str[index+1:]}, "") obj.obj["__value__"] = str - obj.obj["length"] = newNumber().SetUint64(uint64(len(str))) return nil, ArErr{} }} obj.obj["__getindex__"] = builtinFunc{ @@ -105,9 +103,19 @@ func ArString(str string) ArObject { // a[0] is start // a[1] is end // a[2] is step - if len(a) > 3 { + if len(a) > 3 || len(a) == 0 { return nil, ArErr{"Type Error", "expected 1 to 3 arguments, got " + fmt.Sprint(len(a)), 0, "", "", true} } + { + if len(a) == 1 { + if typeof(a[0]) == "string" { + var name = ArValidToAny(a[0]).(string) + if name == "length" { + return newNumber().SetInt64(int64(len(str))), ArErr{} + } + } + } + } var ( start int = 0 end any = nil @@ -196,7 +204,6 @@ func ArString(str string) ArObject { } str = strings.Join(output, "") obj.obj["__value__"] = str - obj.obj["length"] = newNumber().SetUint64(uint64(len(str))) return nil, ArErr{} }} obj.obj["extend"] = builtinFunc{ @@ -217,7 +224,6 @@ func ArString(str string) ArObject { } str = strings.Join(output, "") obj.obj["__value__"] = str - obj.obj["length"] = newNumber().SetUint64(uint64(len(str))) return nil, ArErr{} }, } @@ -242,7 +248,6 @@ func ArString(str string) ArObject { } str = str[:index] + a[1].(string) + str[index:] obj.obj["__value__"] = str - obj.obj["length"] = newNumber().SetUint64(uint64(len(str))) return nil, ArErr{} }} obj.obj["concat"] = builtinFunc{ @@ -454,7 +459,6 @@ func ArString(str string) ArObject { bytes[i] = b.(byte) } str = string(bytes) - obj.obj["length"] = newNumber().SetUint64(uint64(len(str))) obj.obj["__value__"] = str return nil, ArErr{} } @@ -474,7 +478,6 @@ func ArString(str string) ArObject { bytes[i] = b.(byte) } str = string(bytes) - obj.obj["length"] = newNumber().SetUint64(uint64(len(str))) obj.obj["__value__"] = str return nil, ArErr{} },