use constants for True and False instead of tokens
This commit is contained in:
parent
a216d9af41
commit
53adeacc6d
5 changed files with 25 additions and 19 deletions
|
|
@ -26,6 +26,9 @@ const (
|
|||
NUMBER Token_t = iota
|
||||
SYMBOL Token_t = iota
|
||||
BOOL Token_t = iota
|
||||
|
||||
TRUE string = "T"
|
||||
FALSE string = "F"
|
||||
)
|
||||
|
||||
type Token struct {
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ func InitVarTable(table VarTable) {
|
|||
}
|
||||
|
||||
if variable[0] == "HOME" {
|
||||
SetVar('~', t, table)
|
||||
SetVar("~", t, table)
|
||||
}
|
||||
SetVar(variable[0], t, table)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,9 +31,9 @@ func not(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
return nil
|
||||
}
|
||||
|
||||
out := "T"
|
||||
if in.Value() == "T" {
|
||||
out = "F"
|
||||
out := ast.TRUE
|
||||
if in.Value() == ast.TRUE {
|
||||
out = ast.FALSE
|
||||
}
|
||||
|
||||
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 {
|
||||
out := "T"
|
||||
out := ast.TRUE
|
||||
second := in.Next
|
||||
|
||||
in = in.Eval(ft, vt, false)
|
||||
|
||||
if in.Tag != second.Tag {
|
||||
out = "F"
|
||||
out = ast.FALSE
|
||||
} else {
|
||||
switch in.Tag {
|
||||
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()) {
|
||||
out = "F"
|
||||
out = ast.FALSE
|
||||
}
|
||||
|
||||
case ast.STRING, ast.BOOL:
|
||||
if in.Value() != second.Value() {
|
||||
out = "F"
|
||||
out = ast.FALSE
|
||||
}
|
||||
|
||||
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 {
|
||||
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 {
|
||||
out := "T"
|
||||
out := ast.TRUE
|
||||
second := in.Next
|
||||
|
||||
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)
|
||||
|
||||
if l >= r {
|
||||
out = "F"
|
||||
out = ast.FALSE
|
||||
}
|
||||
|
||||
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 {
|
||||
out := "T"
|
||||
out := ast.TRUE
|
||||
second := in.Next
|
||||
|
||||
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)
|
||||
|
||||
if l <= r {
|
||||
out = "F"
|
||||
out = ast.FALSE
|
||||
}
|
||||
|
||||
t := &ast.Token{Tag: ast.BOOL}
|
||||
|
|
|
|||
|
|
@ -17,11 +17,14 @@
|
|||
|
||||
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
|
||||
*/
|
||||
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
|
||||
t := cond.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
|
||||
*/
|
||||
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
|
||||
forms := in.Next
|
||||
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
|
||||
for eval.Tag == ast.BOOL && eval.Value() == 'T' {
|
||||
for eval.Tag == ast.BOOL && eval.Value() == ast.TRUE {
|
||||
// eval all forms
|
||||
for i := forms; i != nil; i = i.Next {
|
||||
res = i.Eval(ft, vt, false)
|
||||
}
|
||||
|
||||
// retest eval
|
||||
eval := cond.Eval(ft, vt, false)
|
||||
eval = cond.Eval(ft, vt, false)
|
||||
}
|
||||
|
||||
return res
|
||||
|
|
|
|||
|
|
@ -264,6 +264,6 @@ func sh_info(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
|||
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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue