mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 00:46:07 +00:00
start adding maps
This commit is contained in:
0
build.sh → build
Normal file → Executable file
0
build.sh → build
Normal file → Executable file
2
run
Executable file
2
run
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
# run the go run command passing the path to the main.go file, with the working directory set to the bin folder. pass in the arguments
|
||||||
|
go run ./src $@
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type builtinFunc struct {
|
type builtinFunc struct {
|
||||||
name string
|
name string
|
||||||
@@ -32,3 +35,15 @@ func ArgonMult(args ...any) (any, ArErr) {
|
|||||||
return newNumber().Mul(y.(number), x.(number))
|
return newNumber().Mul(y.(number), x.(number))
|
||||||
}, args), ArErr{}
|
}, args), ArErr{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ArgonSleep(args ...any) (any, ArErr) {
|
||||||
|
if len(args) > 0 {
|
||||||
|
float, _ := args[0].(number).Float64()
|
||||||
|
time.Sleep(time.Duration(float*1000000000) * time.Nanosecond)
|
||||||
|
}
|
||||||
|
return nil, ArErr{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArgonTimestamp(args ...any) (any, ArErr) {
|
||||||
|
return newNumber().Quo(newNumber().SetInt64(time.Now().UnixNano()), newNumber().SetInt64(1000000000)), ArErr{}
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,10 +15,22 @@ func init() {
|
|||||||
EXISTS: true,
|
EXISTS: true,
|
||||||
VAL: builtinFunc{"div", ArgonDiv},
|
VAL: builtinFunc{"div", ArgonDiv},
|
||||||
}
|
}
|
||||||
|
vars["true"] = variableValue{
|
||||||
|
EXISTS: true,
|
||||||
|
VAL: true,
|
||||||
|
}
|
||||||
|
vars["false"] = variableValue{
|
||||||
|
EXISTS: true,
|
||||||
|
VAL: false,
|
||||||
|
}
|
||||||
vars["mult"] = variableValue{
|
vars["mult"] = variableValue{
|
||||||
EXISTS: true,
|
EXISTS: true,
|
||||||
VAL: builtinFunc{"mult", ArgonMult},
|
VAL: builtinFunc{"mult", ArgonMult},
|
||||||
}
|
}
|
||||||
|
vars["time"] = variableValue{
|
||||||
|
EXISTS: true,
|
||||||
|
VAL: ArMap{"snooze": builtinFunc{"snooze", ArgonSleep}, "now": builtinFunc{"now", ArgonTimestamp}},
|
||||||
|
}
|
||||||
pi, _ := newNumber().SetString("3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989")
|
pi, _ := newNumber().SetString("3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989")
|
||||||
vars["PI"] = variableValue{
|
vars["PI"] = variableValue{
|
||||||
EXISTS: true,
|
EXISTS: true,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ type call struct {
|
|||||||
args []any
|
args []any
|
||||||
code string
|
code string
|
||||||
line int
|
line int
|
||||||
|
path string
|
||||||
}
|
}
|
||||||
|
|
||||||
func isCall(code UNPARSEcode) bool {
|
func isCall(code UNPARSEcode) bool {
|
||||||
@@ -50,10 +51,10 @@ func parseCall(code UNPARSEcode, index int, codelines []UNPARSEcode) (any, bool,
|
|||||||
if !works {
|
if !works {
|
||||||
return nil, false, ArErr{"Syntax Error", "invalid call", code.line, code.path, code.realcode, true}, 1
|
return nil, false, ArErr{"Syntax Error", "invalid call", code.line, code.path, code.realcode, true}, 1
|
||||||
}
|
}
|
||||||
return call{callable: callable, args: arguments, line: code.line, code: code.code}, true, ArErr{}, 1
|
return call{callable: callable, args: arguments, line: code.line, code: code.realcode, path: code.path}, true, ArErr{}, 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func runCall(c call, stack []map[string]variableValue) (any, ArErr) {
|
func runCall(c call, stack stack) (any, ArErr) {
|
||||||
callable, err := runVal(c.callable, stack)
|
callable, err := runVal(c.callable, stack)
|
||||||
if err.EXISTS {
|
if err.EXISTS {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -70,7 +71,7 @@ func runCall(c call, stack []map[string]variableValue) (any, ArErr) {
|
|||||||
case builtinFunc:
|
case builtinFunc:
|
||||||
return x.FUNC(args...)
|
return x.FUNC(args...)
|
||||||
case Callable:
|
case Callable:
|
||||||
return nil, ArErr{"Runtime Error", "cannot call a class", c.line, "", c.code, true}
|
return nil, ArErr{"Runtime Error", "cannot call a class", c.line, c.path, c.code, true}
|
||||||
}
|
}
|
||||||
return nil, ArErr{"Runtime Error", typeof(callable) + "' is not callable", c.line, "", c.code, true}
|
return nil, ArErr{"Runtime Error", "type '" + typeof(callable) + "' is not callable", c.line, c.path, c.code, true}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ type Callable struct {
|
|||||||
name string
|
name string
|
||||||
params []string
|
params []string
|
||||||
code []any
|
code []any
|
||||||
stack []map[string]variableValue
|
stack stack
|
||||||
line int
|
line int
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ func importMod(realpath string, origin string, main bool) ArErr {
|
|||||||
if translationerr.EXISTS {
|
if translationerr.EXISTS {
|
||||||
return translationerr
|
return translationerr
|
||||||
}
|
}
|
||||||
_, runimeErr := run(translated, []map[string]variableValue{vars})
|
_, runimeErr := run(translated, stack{vars})
|
||||||
if runimeErr.EXISTS {
|
if runimeErr.EXISTS {
|
||||||
return runimeErr
|
return runimeErr
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
// args without the program path
|
// args without the program path
|
||||||
var Args = os.Args[1:]
|
var Args = os.Args[1:]
|
||||||
|
|
||||||
|
type stack = []map[string]variableValue
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ex, e := os.Getwd()
|
ex, e := os.Getwd()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
|
|||||||
68
src/map.go
Normal file
68
src/map.go
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ArMap = map[any]any
|
||||||
|
|
||||||
|
var mapGetCompile = makeRegex(".+\\.([a-zA-Z_])([a-zA-Z0-9_])*( *)")
|
||||||
|
|
||||||
|
type ArMapGet struct {
|
||||||
|
VAL any
|
||||||
|
key any
|
||||||
|
line int
|
||||||
|
code string
|
||||||
|
path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func mapGet(r ArMapGet, stack stack) (any, ArErr) {
|
||||||
|
resp, err := runVal(r.VAL, stack)
|
||||||
|
if err.EXISTS {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
key, err := runVal(r.key, stack)
|
||||||
|
if err.EXISTS {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
switch m := resp.(type) {
|
||||||
|
case ArMap:
|
||||||
|
if _, ok := m[key]; !ok {
|
||||||
|
return nil, ArErr{
|
||||||
|
"KeyError",
|
||||||
|
"key '" + fmt.Sprint(key) + "' not found",
|
||||||
|
r.line,
|
||||||
|
r.path,
|
||||||
|
r.code,
|
||||||
|
true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m[key], ArErr{}
|
||||||
|
}
|
||||||
|
return nil, ArErr{
|
||||||
|
"TypeError",
|
||||||
|
"cannot read " + anyToArgon(key, true) + " from type '" + typeof(resp) + "'",
|
||||||
|
r.line,
|
||||||
|
r.path,
|
||||||
|
r.code,
|
||||||
|
true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func isMapGet(code UNPARSEcode) bool {
|
||||||
|
return mapGetCompile.MatchString(code.code)
|
||||||
|
}
|
||||||
|
|
||||||
|
func mapGetParse(code UNPARSEcode, index int, codelines []UNPARSEcode) (ArMapGet, bool, ArErr, int) {
|
||||||
|
trim := strings.TrimSpace(code.code)
|
||||||
|
split := strings.Split(trim, ".")
|
||||||
|
start := strings.Join(split[:len(split)-1], ".")
|
||||||
|
key := split[len(split)-1]
|
||||||
|
resp, worked, err, i := translateVal(UNPARSEcode{code: start, realcode: code.realcode, line: code.line, path: code.path}, index, codelines, false)
|
||||||
|
if !worked {
|
||||||
|
return ArMapGet{}, false, err, i
|
||||||
|
}
|
||||||
|
k := translateString{key, code.realcode, code.line}
|
||||||
|
return ArMapGet{resp, k, code.line, code.realcode, code.path}, true, ArErr{}, 1
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
// returns (number|string|nil), error
|
// returns (number|string|nil), error
|
||||||
func runVal(line any, stack []map[string]variableValue) (any, ArErr) {
|
func runVal(line any, stack stack) (any, ArErr) {
|
||||||
switch x := line.(type) {
|
switch x := line.(type) {
|
||||||
case translateNumber:
|
case translateNumber:
|
||||||
return (x.number), ArErr{}
|
return (x.number), ArErr{}
|
||||||
@@ -11,12 +11,14 @@ func runVal(line any, stack []map[string]variableValue) (any, ArErr) {
|
|||||||
return runCall(x, stack)
|
return runCall(x, stack)
|
||||||
case accessVariable:
|
case accessVariable:
|
||||||
return readVariable(x, stack)
|
return readVariable(x, stack)
|
||||||
|
case ArMapGet:
|
||||||
|
return mapGet(x, stack)
|
||||||
}
|
}
|
||||||
panic("unreachable")
|
panic("unreachable")
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns error
|
// returns error
|
||||||
func run(translated []any, stack []map[string]variableValue) (any, ArErr) {
|
func run(translated []any, stack stack) (any, ArErr) {
|
||||||
for _, val := range translated {
|
for _, val := range translated {
|
||||||
_, err := runVal(val, stack)
|
_, err := runVal(val, stack)
|
||||||
if err.EXISTS {
|
if err.EXISTS {
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ func translateVal(code UNPARSEcode, index int, codelines []UNPARSEcode, isLine b
|
|||||||
return parseCall(code, index, codelines)
|
return parseCall(code, index, codelines)
|
||||||
} else if isVariable(code) {
|
} else if isVariable(code) {
|
||||||
return parseVariable(code)
|
return parseVariable(code)
|
||||||
|
} else if isMapGet(code) {
|
||||||
|
return mapGetParse(code, index, codelines)
|
||||||
} else if isNumber(code) {
|
} else if isNumber(code) {
|
||||||
return parseNumber(code)
|
return parseNumber(code)
|
||||||
} else if isString(code) {
|
} else if isString(code) {
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ func parseVariable(code UNPARSEcode) (accessVariable, bool, ArErr, int) {
|
|||||||
return accessVariable{name: name, code: code.code, line: code.line}, true, ArErr{}, 1
|
return accessVariable{name: name, code: code.code, line: code.line}, true, ArErr{}, 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func readVariable(v accessVariable, stack []map[string]variableValue) (any, ArErr) {
|
func readVariable(v accessVariable, stack stack) (any, ArErr) {
|
||||||
for i := len(stack) - 1; i >= 0; i-- {
|
for i := len(stack) - 1; i >= 0; i-- {
|
||||||
if val, ok := stack[i][v.name]; ok {
|
if val, ok := stack[i][v.name]; ok {
|
||||||
return val.VAL, ArErr{}
|
return val.VAL, ArErr{}
|
||||||
|
|||||||
Reference in New Issue
Block a user