mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 08:56:07 +00:00
make arrays an object
This commit is contained in:
156
src/built-ins.go
156
src/built-ins.go
@@ -1,97 +1,97 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var vars = scope{}
|
||||
var vars = Map(anymap{})
|
||||
|
||||
func init() {
|
||||
vars["global"] = vars
|
||||
vars["term"] = ArTerm
|
||||
vars["input"] = builtinFunc{"input", ArgonInput}
|
||||
vars["number"] = builtinFunc{"number", ArgonNumber}
|
||||
vars["string"] = builtinFunc{"string", ArgonString}
|
||||
vars["infinity"] = infinity
|
||||
vars["length"] = builtinFunc{"length", func(a ...any) (any, ArErr) {
|
||||
vars.obj["global"] = vars
|
||||
vars.obj["term"] = ArTerm
|
||||
vars.obj["input"] = builtinFunc{"input", ArgonInput}
|
||||
vars.obj["number"] = builtinFunc{"number", ArgonNumber}
|
||||
vars.obj["string"] = builtinFunc{"string", ArgonString}
|
||||
vars.obj["infinity"] = infinity
|
||||
vars.obj["length"] = builtinFunc{"length", func(a ...any) (any, ArErr) {
|
||||
switch x := a[0].(type) {
|
||||
case string:
|
||||
return len(x), ArErr{}
|
||||
case ArMap:
|
||||
return len(x), ArErr{}
|
||||
case ArObject:
|
||||
if x.TYPE == "array" {
|
||||
return len(x.obj["__value__"].([]any)), ArErr{}
|
||||
}
|
||||
return len(x.obj), ArErr{}
|
||||
}
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot get length of " + typeof(a[0]), EXISTS: true}
|
||||
}}
|
||||
vars["map"] = builtinFunc{"map", func(a ...any) (any, ArErr) {
|
||||
vars.obj["map"] = builtinFunc{"map", func(a ...any) (any, ArErr) {
|
||||
if len(a) == 0 {
|
||||
return ArMap{}, ArErr{}
|
||||
return Map(anymap{}), ArErr{}
|
||||
}
|
||||
switch x := a[0].(type) {
|
||||
case ArMap:
|
||||
case ArObject:
|
||||
if x.TYPE == "array" {
|
||||
newmap := anymap{}
|
||||
for i, v := range x.obj["__value__"].([]any) {
|
||||
switch y := v.(type) {
|
||||
case []any:
|
||||
if len(y) == 2 {
|
||||
if isUnhashable(y[0]) {
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot use unhashable value as key: " + typeof(y[0]), EXISTS: true}
|
||||
}
|
||||
newmap[y[0]] = y[1]
|
||||
continue
|
||||
}
|
||||
}
|
||||
newmap[i] = v
|
||||
}
|
||||
return Map(newmap), ArErr{}
|
||||
}
|
||||
return x, ArErr{}
|
||||
case string:
|
||||
newmap := ArMap{}
|
||||
newmap := anymap{}
|
||||
for i, v := range x {
|
||||
newmap[i] = string(v)
|
||||
}
|
||||
return newmap, ArErr{}
|
||||
case ArArray:
|
||||
newmap := ArMap{}
|
||||
for i, v := range x {
|
||||
switch y := v.(type) {
|
||||
case ArArray:
|
||||
if len(y) == 2 {
|
||||
if isUnhashable(y[0]) {
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot use unhashable value as key: " + typeof(y[0]), EXISTS: true}
|
||||
}
|
||||
newmap[y[0]] = y[1]
|
||||
continue
|
||||
}
|
||||
}
|
||||
newmap[i] = v
|
||||
}
|
||||
return newmap, ArErr{}
|
||||
return Map(newmap), ArErr{}
|
||||
}
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot create map from '" + typeof(a[0]) + "'", EXISTS: true}
|
||||
}}
|
||||
vars["array"] = builtinFunc{"array", func(a ...any) (any, ArErr) {
|
||||
vars.obj["array"] = builtinFunc{"array", func(a ...any) (any, ArErr) {
|
||||
if len(a) == 0 {
|
||||
return ArArray{}, ArErr{}
|
||||
return ArArray([]any{}), ArErr{}
|
||||
}
|
||||
switch x := a[0].(type) {
|
||||
case ArArray:
|
||||
return x, ArErr{}
|
||||
case string:
|
||||
newarray := ArArray{}
|
||||
newarray := []any{}
|
||||
for _, v := range x {
|
||||
newarray = append(newarray, string(v))
|
||||
}
|
||||
return newarray, ArErr{}
|
||||
case ArMap:
|
||||
newarray := ArArray{}
|
||||
for key, val := range x {
|
||||
newarray = append(newarray, ArArray{key, val})
|
||||
return ArArray(newarray), ArErr{}
|
||||
case ArObject:
|
||||
if x.TYPE == "array" {
|
||||
return x, ArErr{}
|
||||
}
|
||||
return newarray, ArErr{}
|
||||
newarray := []any{}
|
||||
for key, val := range x.obj {
|
||||
newarray = append(newarray, []any{key, val})
|
||||
}
|
||||
return ArArray(newarray), ArErr{}
|
||||
}
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot create array from '" + typeof(a[0]) + "'", EXISTS: true}
|
||||
}}
|
||||
vars["boolean"] = builtinFunc{"boolean", func(a ...any) (any, ArErr) {
|
||||
vars.obj["boolean"] = builtinFunc{"boolean", func(a ...any) (any, ArErr) {
|
||||
if len(a) == 0 {
|
||||
return false, ArErr{}
|
||||
}
|
||||
return anyToBool(a[0]), ArErr{}
|
||||
}}
|
||||
vars["time"] = ArTime
|
||||
vars["PI"] = PI
|
||||
vars["π"] = PI
|
||||
vars["e"] = e
|
||||
vars["ln"] = builtinFunc{"ln", ArgonLn}
|
||||
vars["log"] = builtinFunc{"log", ArgonLog}
|
||||
vars["logN"] = builtinFunc{"logN", ArgonLogN}
|
||||
vars["thread"] = builtinFunc{"thread", ArThread}
|
||||
vars["round"] = builtinFunc{"round", func(a ...any) (any, ArErr) {
|
||||
vars.obj["time"] = ArTime
|
||||
vars.obj["PI"] = PI
|
||||
vars.obj["π"] = PI
|
||||
vars.obj["e"] = e
|
||||
vars.obj["ln"] = builtinFunc{"ln", ArgonLn}
|
||||
vars.obj["log"] = builtinFunc{"log", ArgonLog}
|
||||
vars.obj["logN"] = builtinFunc{"logN", ArgonLogN}
|
||||
vars.obj["thread"] = builtinFunc{"thread", ArThread}
|
||||
vars.obj["round"] = builtinFunc{"round", func(a ...any) (any, ArErr) {
|
||||
if len(a) == 0 {
|
||||
return nil, ArErr{TYPE: "round", message: "round takes 1 argument",
|
||||
EXISTS: true}
|
||||
@@ -115,7 +115,7 @@ func init() {
|
||||
}
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot round '" + typeof(a[0]) + "'", EXISTS: true}
|
||||
}}
|
||||
vars["floor"] = builtinFunc{"floor", func(a ...any) (any, ArErr) {
|
||||
vars.obj["floor"] = builtinFunc{"floor", func(a ...any) (any, ArErr) {
|
||||
if len(a) == 0 {
|
||||
return nil, ArErr{TYPE: "floor", message: "floor takes 1 argument",
|
||||
EXISTS: true}
|
||||
@@ -126,7 +126,7 @@ func init() {
|
||||
}
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot floor '" + typeof(a[0]) + "'", EXISTS: true}
|
||||
}}
|
||||
vars["ceil"] = builtinFunc{"ceil", func(a ...any) (any, ArErr) {
|
||||
vars.obj["ceil"] = builtinFunc{"ceil", func(a ...any) (any, ArErr) {
|
||||
if len(a) == 0 {
|
||||
return nil, ArErr{TYPE: "ceil", message: "ceil takes 1 argument",
|
||||
EXISTS: true}
|
||||
@@ -138,36 +138,10 @@ func init() {
|
||||
}
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot ceil '" + typeof(a[0]) + "'", EXISTS: true}
|
||||
}}
|
||||
vars["append"] = builtinFunc{"append", func(a ...any) (any, ArErr) {
|
||||
if len(a) != 2 {
|
||||
return nil, ArErr{TYPE: "append", message: "append takes 2 arguments, got " + fmt.Sprint(len(a)),
|
||||
EXISTS: true}
|
||||
}
|
||||
switch x := a[0].(type) {
|
||||
case ArArray:
|
||||
return append(x, a[1]), ArErr{}
|
||||
case string:
|
||||
if typeof(a[1]) != "string" {
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot append '" + typeof(a[1]) + "' to string", EXISTS: true}
|
||||
}
|
||||
return strings.Join([]string{x, a[1].(string)}, ""), ArErr{}
|
||||
case ArMap:
|
||||
if typeof(a[1]) != "array" {
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot append '" + typeof(a[1]) + "' to map", EXISTS: true}
|
||||
}
|
||||
y := a[1].(ArArray)
|
||||
if len(y) != 2 {
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot append '" + typeof(a[1]) + "' to map", EXISTS: true}
|
||||
}
|
||||
x[y[0]] = y[1]
|
||||
return x, ArErr{}
|
||||
}
|
||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot append to '" + typeof(a[0]) + "'", EXISTS: true}
|
||||
}}
|
||||
vars["sqrt"] = builtinFunc{"sqrt", ArgonSqrt}
|
||||
vars["file"] = ArFile
|
||||
vars["random"] = ArRandom
|
||||
vars["json"] = ArJSON
|
||||
vars["sin"] = ArSin
|
||||
vars["arcsin"] = ArArcsin
|
||||
vars.obj["sqrt"] = builtinFunc{"sqrt", ArgonSqrt}
|
||||
vars.obj["file"] = ArFile
|
||||
vars.obj["random"] = ArRandom
|
||||
vars.obj["json"] = ArJSON
|
||||
vars.obj["sin"] = ArSin
|
||||
vars.obj["arcsin"] = ArArcsin
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user