perform arg type checking and evaluation before function call
This commit is contained in:
parent
90284f2d06
commit
ab340ceb0a
9 changed files with 223 additions and 354 deletions
|
|
@ -30,13 +30,7 @@ import (
|
|||
* in event a not-list is passed in, returns the arg.
|
||||
*/
|
||||
func Expand(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
||||
input = input.Eval(funcs, vars, false)
|
||||
if input.Tag != ast.LIST {
|
||||
log.Log(log.INFO, "expand called on not a list", "expand")
|
||||
return input
|
||||
}
|
||||
|
||||
return input.Eval(funcs, vars, false).Expand()
|
||||
return input.Expand()
|
||||
}
|
||||
|
||||
/* L_APPEND (append from repl)
|
||||
|
|
@ -45,7 +39,6 @@ func Expand(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token
|
|||
* if no args are a list, a list is made from all args
|
||||
*/
|
||||
func L_append(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
||||
input = input.Eval(funcs, vars, false)
|
||||
src := input
|
||||
|
||||
if input.Tag != ast.LIST {
|
||||
|
|
@ -74,24 +67,28 @@ func L_append(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Tok
|
|||
}
|
||||
|
||||
/* Len
|
||||
* Returns length of list as a number
|
||||
* Returns nil if not a list
|
||||
* Returns length of list or string as a number
|
||||
* Returns nil if not a list or string
|
||||
*
|
||||
* Example: () -> 0
|
||||
* Example: (1 2 3) -> 3
|
||||
*/
|
||||
func Len(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
||||
input = input.Eval(funcs, vars, false)
|
||||
if input.Tag != ast.LIST {
|
||||
if input.Tag != ast.LIST && input.Tag != ast.STRING {
|
||||
log.Log(log.ERR,
|
||||
"non-list as parameter to head",
|
||||
"must provide list or strinig",
|
||||
"head")
|
||||
return nil
|
||||
}
|
||||
|
||||
length := 0
|
||||
for iter := input.Expand(); iter != nil; iter = iter.Next {
|
||||
length += 1
|
||||
if input.Tag = ast.STRING {
|
||||
length = len(input.Value())
|
||||
|
||||
} else {
|
||||
for iter := input.Expand(); iter != nil; iter = iter.Next {
|
||||
length += 1
|
||||
}
|
||||
}
|
||||
|
||||
ret := &ast.Token{Tag: ast.NUMBER}
|
||||
|
|
@ -106,14 +103,6 @@ func Len(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
|||
* Example: (head (2 3 4)) -> 2
|
||||
*/
|
||||
func Head(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
||||
input = input.Eval(funcs, vars, false)
|
||||
if input.Tag != ast.LIST {
|
||||
log.Log(log.ERR,
|
||||
"non-list as parameter to head",
|
||||
"head")
|
||||
return nil
|
||||
}
|
||||
|
||||
li := input.Expand().Copy()
|
||||
if li != nil {
|
||||
li.Next = nil
|
||||
|
|
@ -129,15 +118,6 @@ func Head(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
|||
* Example: (tail (2 3 4)) -> 4
|
||||
*/
|
||||
func Tail(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
||||
input = input.Eval(funcs, vars, false)
|
||||
if input.Tag != ast.LIST {
|
||||
log.Log(log.ERR,
|
||||
"non-list as parameter to head",
|
||||
"head")
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
iter := input.Expand()
|
||||
for iter != nil && iter.Next != nil {
|
||||
iter = iter.Next
|
||||
|
|
@ -158,25 +138,10 @@ func Tail(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
|||
* Example: (slice 0 0 (1 2 3)) -> (1)
|
||||
*/
|
||||
func Slice(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token {
|
||||
input = input.Eval(funcs, vars, false)
|
||||
start := input
|
||||
end := input.Next
|
||||
source := end.Next
|
||||
|
||||
if start.Tag != ast.NUMBER || end.Tag != ast.NUMBER {
|
||||
log.Log(log.ERR,
|
||||
"start and end must both be integers",
|
||||
"slice")
|
||||
return nil
|
||||
}
|
||||
|
||||
if source.Tag != ast.LIST {
|
||||
log.Log(log.ERR,
|
||||
"non-list as parameter to head",
|
||||
"head")
|
||||
return nil
|
||||
}
|
||||
|
||||
st, err := strconv.ParseInt(start.Value(), 10, 64)
|
||||
en, errr := strconv.ParseInt(end.Value(), 10, 64)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue