eval: add len
This commit is contained in:
@@ -9,9 +9,8 @@
|
|||||||
- Destructuring assignment
|
- Destructuring assignment
|
||||||
- `maptable`
|
- `maptable`
|
||||||
- `coerce`
|
- `coerce`
|
||||||
- `len`
|
|
||||||
- `mac`
|
- `mac`
|
||||||
- `\``
|
- `````
|
||||||
- `w/link`
|
- `w/link`
|
||||||
- `aform`
|
- `aform`
|
||||||
- ...
|
- ...
|
||||||
|
28
eval/eval.go
28
eval/eval.go
@@ -26,6 +26,7 @@ func RootEnv() ast.Env {
|
|||||||
"pr": evalPr,
|
"pr": evalPr,
|
||||||
"table": evalTable,
|
"table": evalTable,
|
||||||
"type": evalType,
|
"type": evalType,
|
||||||
|
"len": evalLen,
|
||||||
}
|
}
|
||||||
|
|
||||||
for k, v := range prims {
|
for k, v := range prims {
|
||||||
@@ -453,6 +454,33 @@ func evalType(l []*ast.AST) (*ast.AST, error) {
|
|||||||
return l[0].Type(), nil
|
return l[0].Type(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func evalLen(l []*ast.AST) (*ast.AST, error) {
|
||||||
|
err := checkArity(l, 1, "len")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cnt := 0
|
||||||
|
elem := l[0]
|
||||||
|
|
||||||
|
switch elem.Tag {
|
||||||
|
case ast.Quoted:
|
||||||
|
// TODO: error handling
|
||||||
|
cnt = len(elem.Val.(*ast.AST).Val.([]*ast.AST))
|
||||||
|
case ast.String:
|
||||||
|
cnt = len(elem.Val.(string))
|
||||||
|
case ast.Table:
|
||||||
|
cnt = len(elem.Val.(map[*ast.AST]*ast.AST))
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("Cannot get length of %s", elem.Pretty())
|
||||||
|
}
|
||||||
|
|
||||||
|
res := ast.AST{ast.Num, float64(cnt)}
|
||||||
|
|
||||||
|
return &res, nil
|
||||||
|
}
|
||||||
|
|
||||||
func evalSymbolList(l []*ast.AST, e ast.Env) (*ast.AST, error) {
|
func evalSymbolList(l []*ast.AST, e ast.Env) (*ast.AST, error) {
|
||||||
sym := l[0].Val.(string)
|
sym := l[0].Val.(string)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user