From 1813cca48cef74f2d1529434d2d895daab164618 Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Thu, 7 Apr 2022 17:26:43 -0400 Subject: [EVAL] Setting globals + Setting global variables now works ~ Defining/setting local variables still does not. --- src/texec/eval.go | 75 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/src/texec/eval.go b/src/texec/eval.go index 1ca290b..a538a80 100644 --- a/src/texec/eval.go +++ b/src/texec/eval.go @@ -569,7 +569,7 @@ func convertValPS(to TType, sk int, dat interface{}) interface{} { return nil } -func convertVal(dat TVariable, to TType) *TVariable { +func convertVal(dat *TVariable, to TType) *TVariable { return &TVariable{to, convertValPS(to, 0, dat.Data)} } @@ -601,9 +601,6 @@ func resolveArtifact(a TArtifact, ctx *VarMap) *TVariable { if !prs || len(a.Path) != 0 { // Try searching the modules for it val = searchDef(a) - if val == nil { - errOutCTX(fmt.Sprintf("Could not resolve %s in the current context.", a.Name), ctx) - } } return val } @@ -669,7 +666,33 @@ func evalDotChain(v tparse.Node, ctx *VarMap, wk *TVariable) *TVariable { } func setVal(v tparse.Node, ctx *VarMap, val *TVariable) *TVariable { - return &null + art := TArtifact{[]string{}, v.Data.Data} + wrk := resolveArtifact(art, ctx) + + if v.Data.Data == "." { + art.Name = v.Sub[0].Data.Data + wrk := resolveArtifact(art, ctx) + for ;wrk == nil; { + art.Path = append(art.Path, art.Name) + v = v.Sub[1] + if v.Data.Data == "." { + art.Name = v.Sub[0].Data.Data + wrk = resolveArtifact(art, ctx) + } else { + art.Name = v.Data.Data + wrk = resolveArtifact(art, ctx) + break + } + } + } + + if wrk == nil { + errOutCTX(fmt.Sprintf("Unable to set variable %s due to the variable not existing.", art), ctx) + } + + (*wrk).Data = convertValPS((*wrk).Type, 0, val.Data) + + return wrk } func evalCall() { @@ -729,48 +752,42 @@ func evalValue(v tparse.Node, ctx *VarMap) *TVariable { } else if v.Data.Data == "!" { - a := evalValue(v.Sub[0], ctx) + a := convertVal(evalValue(v.Sub[0], ctx), tBool) return &TVariable{tBool, !(a.Data.(bool))} } // General case setup - a, b := evalValue(v.Sub[0], ctx), evalValue(v.Sub[1], ctx) + a := convertVal(evalValue(v.Sub[0], ctx), tFloat) + b := convertVal(evalValue(v.Sub[1], ctx), tFloat) var out TVariable - out.Type = tInt + out.Type = tFloat // General math and bool cases switch v.Data.Data { case "+": - out.Data = a.Data.(int) + b.Data.(int) + out.Data = a.Data.(float64) + b.Data.(float64) case "-": - out.Data = a.Data.(int) - b.Data.(int) + out.Data = a.Data.(float64) - b.Data.(float64) case "*": - out.Data = a.Data.(int) * b.Data.(int) + out.Data = a.Data.(float64) * b.Data.(float64) case "/": - out.Data = a.Data.(int) / b.Data.(int) + out.Data = a.Data.(float64) / b.Data.(float64) case "%": - out.Data = a.Data.(int) % b.Data.(int) + out.Type = tInt + out.Data = int(a.Data.(float64)) % int(b.Data.(float64)) case "&&": out.Type = tBool - out.Data = a.Data.(bool) && b.Data.(bool) + out.Data = a.Data.(float64) == 1 && b.Data.(float64) == 1 case "||": out.Type = tBool - out.Data = a.Data.(bool) || b.Data.(bool) + out.Data = a.Data.(float64) == 1 || b.Data.(float64) == 1 case "==": out.Type = tBool - if equateType(a.Type, b.Type) { - out.Data = a.Data == b.Data - } else { - out.Data = a.Data.(int) == b.Data.(int) - } + out.Data = a.Data == b.Data case "!=": out.Type = tBool - if equateType(a.Type, b.Type) { - out.Data = a.Data != b.Data - } else { - out.Data = a.Data.(int) != b.Data.(int) - } + out.Data = a.Data != b.Data } return &out @@ -785,7 +802,7 @@ func evalDef(v tparse.Node, ctx *VarMap) { for i := 0; i < len(v.Sub[1].Sub); i++ { if v.Sub[1].Sub[i].Data.Data == "=" { - (*ctx)[v.Sub[1].Sub[i].Sub[0].Data.Data] = convertVal(*evalValue(v.Sub[1].Sub[i].Sub[1], ctx), t) + (*ctx)[v.Sub[1].Sub[i].Sub[0].Data.Data] = convertVal(evalValue(v.Sub[1].Sub[i].Sub[1], ctx), t) } else { (*ctx)[v.Sub[1].Sub[i].Data.Data] = &TVariable{t, nil} } @@ -809,7 +826,7 @@ func evalParams(pd tparse.Node, params *[]TVariable, ctx *VarMap) { if pd.Sub[i].Data.Type == 10 && pd.Sub[i].Data.Data == "type" { cvt = getType(pd.Sub[i]) } else if pd.Sub[i].Data.Type == tparse.DEFWORD { - (*ctx)[pd.Sub[i].Data.Data] = convertVal((*params)[pi], cvt) + (*ctx)[pd.Sub[i].Data.Data] = convertVal(&(*params)[pi], cvt) pi++ } } @@ -842,7 +859,7 @@ func evalBlock(b tparse.Node, params []TVariable) TVariable { case "block": ret, val := evalCF(b.Sub[i].Sub[0], &ctx) if ret { - return *convertVal(val, rty) + return *convertVal(&val, rty) } case "return": fmt.Println("--- Block return ---") @@ -850,7 +867,7 @@ func evalBlock(b tparse.Node, params []TVariable) TVariable { ret := *evalValue(b.Sub[i].Sub[0].Sub[0], &ctx) fmt.Println(ret) fmt.Println("--- Return end ---") - return *convertVal(ret, rty) + return *convertVal(&ret, rty) } } -- cgit v1.2.3