use constants for True and False instead of tokens

This commit is contained in:
Aidan 2020-06-30 20:36:45 -07:00
parent a216d9af41
commit 53adeacc6d
No known key found for this signature in database
GPG key ID: 327711E983899316
5 changed files with 25 additions and 19 deletions

View file

@ -26,6 +26,9 @@ const (
NUMBER Token_t = iota NUMBER Token_t = iota
SYMBOL Token_t = iota SYMBOL Token_t = iota
BOOL Token_t = iota BOOL Token_t = iota
TRUE string = "T"
FALSE string = "F"
) )
type Token struct { type Token struct {

View file

@ -105,7 +105,7 @@ func InitVarTable(table VarTable) {
} }
if variable[0] == "HOME" { if variable[0] == "HOME" {
SetVar('~', t, table) SetVar("~", t, table)
} }
SetVar(variable[0], t, table) SetVar(variable[0], t, table)
} }

View file

@ -31,9 +31,9 @@ func not(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
return nil return nil
} }
out := "T" out := ast.TRUE
if in.Value() == "T" { if in.Value() == ast.TRUE {
out = "F" out = ast.FALSE
} }
t := &ast.Token{Tag: ast.BOOL} t := &ast.Token{Tag: ast.BOOL}
@ -42,13 +42,13 @@ func not(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
} }
func eq(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { func eq(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
out := "T" out := ast.TRUE
second := in.Next second := in.Next
in = in.Eval(ft, vt, false) in = in.Eval(ft, vt, false)
if in.Tag != second.Tag { if in.Tag != second.Tag {
out = "F" out = ast.FALSE
} else { } else {
switch in.Tag { switch in.Tag {
case ast.LIST: case ast.LIST:
@ -94,12 +94,12 @@ func eq(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
} }
if consume_list(in.Expand(), second.Expand()) { if consume_list(in.Expand(), second.Expand()) {
out = "F" out = ast.FALSE
} }
case ast.STRING, ast.BOOL: case ast.STRING, ast.BOOL:
if in.Value() != second.Value() { if in.Value() != second.Value() {
out = "F" out = ast.FALSE
} }
case ast.NUMBER: case ast.NUMBER:
@ -113,7 +113,7 @@ func eq(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
} }
if l_val != r_val { if l_val != r_val {
out = "F" out = ast.FALSE
} }
} }
} }
@ -124,7 +124,7 @@ func eq(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
} }
func lt(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { func lt(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
out := "T" out := ast.TRUE
second := in.Next second := in.Next
in = in.Eval(ft, vt, false) in = in.Eval(ft, vt, false)
@ -138,7 +138,7 @@ func lt(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
r, _ := strconv.ParseInt(second.Value(), 10, 64) r, _ := strconv.ParseInt(second.Value(), 10, 64)
if l >= r { if l >= r {
out = "F" out = ast.FALSE
} }
t := &ast.Token{Tag: ast.BOOL} t := &ast.Token{Tag: ast.BOOL}
@ -147,7 +147,7 @@ func lt(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
} }
func gt(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { func gt(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
out := "T" out := ast.TRUE
second := in.Next second := in.Next
in = in.Eval(ft, vt, false) in = in.Eval(ft, vt, false)
@ -161,7 +161,7 @@ func gt(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
r, _ := strconv.ParseInt(second.Value(), 10, 64) r, _ := strconv.ParseInt(second.Value(), 10, 64)
if l <= r { if l <= r {
out = "F" out = ast.FALSE
} }
t := &ast.Token{Tag: ast.BOOL} t := &ast.Token{Tag: ast.BOOL}

View file

@ -17,11 +17,14 @@
package stdlib package stdlib
import "gitlab.com/whom/shs/ast" import (
"gitlab.com/whom/shs/ast"
"gitlab.com/whom/shs/log"
)
/* return one evaluated form or another based on the boolean statement /* return one evaluated form or another based on the boolean statement
*/ */
func shs_if(in *ast.Token, vt VarTable, ft FuncTable) *ast.Token { func shs_if(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
cond := in cond := in
t := cond.Next t := cond.Next
f := t.Next f := t.Next
@ -53,7 +56,7 @@ func shs_if(in *ast.Token, vt VarTable, ft FuncTable) *ast.Token {
/* continually eval n forms while element #1 evals to T /* continually eval n forms while element #1 evals to T
*/ */
func shs_while(in *ast.Token, vt VarTable, ft FuncTable) *ast.Token { func shs_while(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
cond := in cond := in
forms := in.Next forms := in.Next
in.Next = nil in.Next = nil
@ -68,14 +71,14 @@ func shs_while(in *ast.Token, vt VarTable, ft FuncTable) *ast.Token {
} }
// slight downside here: doesnt log when the wrong tag is set // slight downside here: doesnt log when the wrong tag is set
for eval.Tag == ast.BOOL && eval.Value() == 'T' { for eval.Tag == ast.BOOL && eval.Value() == ast.TRUE {
// eval all forms // eval all forms
for i := forms; i != nil; i = i.Next { for i := forms; i != nil; i = i.Next {
res = i.Eval(ft, vt, false) res = i.Eval(ft, vt, false)
} }
// retest eval // retest eval
eval := cond.Eval(ft, vt, false) eval = cond.Eval(ft, vt, false)
} }
return res return res

View file

@ -264,6 +264,6 @@ func sh_info(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
return nil return nil
} }
func eval(in *ast.Token, vt ast.VarTable, ft ast.VarTable) *ast.Token { func eval(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
return in.Eval(ft, vt, false) return in.Eval(ft, vt, false)
} }