make maps oop

This commit is contained in:
2023-04-08 15:34:15 +02:00
parent d1cd747e86
commit 644a78154e
33 changed files with 709 additions and 276 deletions

View File

@@ -1,19 +1,24 @@
package main
import (
"fmt"
"os"
)
func makeGlobal() ArObject {
var vars = Map(anymap{})
vars.obj["global"] = vars
vars.obj["term"] = ArTerm
vars.obj["number"] = builtinFunc{"number", ArgonNumber}
vars.obj["string"] = builtinFunc{"string", ArgonString}
vars.obj["infinity"] = infinity
vars.obj["map"] = builtinFunc{"map", func(a ...any) (any, ArErr) {
var vars = anymap{}
vars["global"] = vars
vars["term"] = ArTerm
vars["number"] = builtinFunc{"number", ArgonNumber}
vars["string"] = builtinFunc{"string", ArgonString}
vars["infinity"] = infinity
vars["map"] = builtinFunc{"map", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return Map(anymap{}), ArErr{}
}
switch x := a[0].(type) {
case ArObject:
if x.TYPE == "array" {
if typeof(x) == "array" {
newmap := anymap{}
for i, v := range x.obj["__value__"].([]any) {
v := ArValidToAny(v)
@@ -31,7 +36,7 @@ func makeGlobal() ArObject {
newmap[i] = v
}
return Map(newmap), ArErr{}
} else if x.TYPE == "string" {
} else if typeof(x) == "string" {
newmap := anymap{}
for i, v := range x.obj["__value__"].(string) {
newmap[i] = ArString(string(v))
@@ -42,15 +47,15 @@ func makeGlobal() ArObject {
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot create map from '" + typeof(a[0]) + "'", EXISTS: true}
}}
vars.obj["array"] = builtinFunc{"array", func(a ...any) (any, ArErr) {
vars["array"] = builtinFunc{"array", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return ArArray([]any{}), ArErr{}
}
switch x := a[0].(type) {
case ArObject:
if x.TYPE == "array" {
if typeof(x) == "array" {
return x, ArErr{}
} else if x.TYPE == "string" {
} else if typeof(x) == "string" {
newarray := []any{}
for _, v := range x.obj["__value__"].(string) {
@@ -66,22 +71,22 @@ func makeGlobal() ArObject {
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot create array from '" + typeof(a[0]) + "'", EXISTS: true}
}}
vars.obj["boolean"] = builtinFunc{"boolean", func(a ...any) (any, ArErr) {
vars["boolean"] = builtinFunc{"boolean", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return false, ArErr{}
}
return anyToBool(a[0]), 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["input"] = ArInput
vars.obj["round"] = builtinFunc{"round", func(a ...any) (any, 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["input"] = ArInput
vars["round"] = builtinFunc{"round", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return nil, ArErr{TYPE: "round", message: "round takes 1 argument",
EXISTS: true}
@@ -105,7 +110,7 @@ func makeGlobal() ArObject {
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot round '" + typeof(a[0]) + "'", EXISTS: true}
}}
vars.obj["floor"] = builtinFunc{"floor", func(a ...any) (any, ArErr) {
vars["floor"] = builtinFunc{"floor", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return nil, ArErr{TYPE: "floor", message: "floor takes 1 argument",
EXISTS: true}
@@ -116,7 +121,7 @@ func makeGlobal() ArObject {
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot floor '" + typeof(a[0]) + "'", EXISTS: true}
}}
vars.obj["ceil"] = builtinFunc{"ceil", func(a ...any) (any, ArErr) {
vars["ceil"] = builtinFunc{"ceil", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return nil, ArErr{TYPE: "ceil", message: "ceil takes 1 argument",
EXISTS: true}
@@ -128,26 +133,26 @@ func makeGlobal() ArObject {
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot ceil '" + typeof(a[0]) + "'", EXISTS: true}
}}
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
vars.obj["cos"] = ArCos
vars.obj["arccos"] = ArArccos
vars.obj["tan"] = ArTan
vars.obj["arctan"] = ArArctan
vars.obj["cosec"] = ArCosec
vars.obj["arccosec"] = ArArccosec
vars.obj["sec"] = ArSec
vars.obj["arcsec"] = ArArcsec
vars.obj["cot"] = ArCot
vars.obj["arccot"] = ArArccot
vars.obj["todeg"] = ArToDeg
vars.obj["torad"] = ArToRad
vars.obj["abs"] = ArAbs
vars.obj["dir"] = builtinFunc{"dir", func(a ...any) (any, ArErr) {
vars["sqrt"] = builtinFunc{"sqrt", ArgonSqrt}
vars["file"] = ArFile
vars["random"] = ArRandom
vars["json"] = ArJSON
vars["sin"] = ArSin
vars["arcsin"] = ArArcsin
vars["cos"] = ArCos
vars["arccos"] = ArArccos
vars["tan"] = ArTan
vars["arctan"] = ArArctan
vars["cosec"] = ArCosec
vars["arccosec"] = ArArccosec
vars["sec"] = ArSec
vars["arcsec"] = ArArcsec
vars["cot"] = ArCot
vars["arccot"] = ArArccot
vars["todeg"] = ArToDeg
vars["torad"] = ArToRad
vars["abs"] = ArAbs
vars["dir"] = builtinFunc{"dir", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return ArArray([]any{}), ArErr{}
}
@@ -162,17 +167,17 @@ func makeGlobal() ArObject {
}
return ArArray([]any{}), ArErr{}
}}
vars.obj["subprocess"] = builtinFunc{"subprocess", ArSubprocess}
vars.obj["class"] = builtinFunc{"class", func(a ...any) (any, ArErr) {
vars["subprocess"] = builtinFunc{"subprocess", ArSubprocess}
vars["object"] = builtinFunc{"object", func(a ...any) (any, ArErr) {
if len(a) == 0 {
return nil, ArErr{TYPE: "TypeError", message: "Cannot create class from '" + typeof(a[0]) + "'", EXISTS: true}
}
switch x := a[0].(type) {
case ArObject:
if x.TYPE == "class" {
if typeof(x) == "object" {
return x, ArErr{}
}
newclass := ArObject{TYPE: "class", obj: anymap{}}
newclass := ArObject{obj: anymap{}}
for key, val := range x.obj {
newclass.obj[key] = val
}
@@ -180,5 +185,50 @@ func makeGlobal() ArObject {
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot create class from '" + typeof(a[0]) + "'", EXISTS: true}
}}
return vars
vars["sequence"] = builtinFunc{"sequence", ArSequence}
vars["exit"] = builtinFunc{"exit", func(a ...any) (any, ArErr) {
if len(a) == 0 {
os.Exit(0)
}
switch x := a[0].(type) {
case number:
os.Exit(int(floor(x).Num().Int64()))
}
os.Exit(0)
return nil, ArErr{}
}}
vars["error"] = builtinFunc{"error", func(a ...any) (any, ArErr) {
if len(a) < 1 || len(a) > 2 {
return nil, ArErr{TYPE: "error", message: "error takes 1 or 2 arguments, got " + fmt.Sprint(len(a)), EXISTS: true}
}
if len(a) == 1 {
a[0] = ArValidToAny(a[0])
switch x := a[0].(type) {
case string:
return nil, ArErr{TYPE: "Error", message: x, EXISTS: true}
}
} else {
a[0] = ArValidToAny(a[0])
a[1] = ArValidToAny(a[1])
switch x := a[0].(type) {
case string:
switch y := a[1].(type) {
case string:
return nil, ArErr{TYPE: x, message: y, EXISTS: true}
}
}
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot create error from '" + typeof(a[0]) + "'", EXISTS: true}
}}
vars["chr"] = builtinFunc{"chr", func(a ...any) (any, ArErr) {
if len(a) != 1 {
return nil, ArErr{TYPE: "chr", message: "chr takes 1 argument, got " + fmt.Sprint(len(a)), EXISTS: true}
}
switch x := a[0].(type) {
case number:
return string([]rune{rune(floor(x).Num().Int64())}), ArErr{}
}
return nil, ArErr{TYPE: "TypeError", message: "Cannot convert '" + typeof(a[0]) + "' to string", EXISTS: true}
}}
return Map(vars)
}