all: handle optional args more gracefully
This commit is contained in:
14
ast/ast.go
14
ast/ast.go
@@ -89,13 +89,21 @@ func (ast *AST) Pretty() string {
|
|||||||
for _, elem := range val.Params {
|
for _, elem := range val.Params {
|
||||||
agg = append(agg, elem)
|
agg = append(agg, elem)
|
||||||
}
|
}
|
||||||
opt := ""
|
rest := ""
|
||||||
if val.HasRest() {
|
if val.HasRest() {
|
||||||
opt = " . " + *val.Rest
|
rest = " . " + *val.Rest
|
||||||
}
|
}
|
||||||
// TODO: opt
|
// TODO: opt
|
||||||
|
opt := ""
|
||||||
|
iter := val.Opt.IterFunc()
|
||||||
|
for kv, ok := iter(); ok; kv, ok = iter() {
|
||||||
|
opt += "(o " + kv.Key.(string) + " " + kv.Value.(*AST).Pretty() + ")"
|
||||||
|
}
|
||||||
|
if val.HasOpt() && (val.HasRest() || len(agg) != 0) {
|
||||||
|
opt = " " + opt
|
||||||
|
}
|
||||||
body := val.Body.Pretty()
|
body := val.Body.Pretty()
|
||||||
return "(fn (" + strings.Join(agg, " ") + opt + ") " + body + ")"
|
return "(fn (" + strings.Join(agg, " ") + rest + opt + ") " + body + ")"
|
||||||
} else if ast.Tag == Char {
|
} else if ast.Tag == Char {
|
||||||
return "#" + string(ast.Val.(rune))
|
return "#" + string(ast.Val.(rune))
|
||||||
} else if ast.Tag == Table {
|
} else if ast.Tag == Table {
|
||||||
|
@@ -282,7 +282,7 @@ func evalFn(input []*ast.AST, e ast.Env) (*ast.AST, error) {
|
|||||||
return nil, fmt.Errorf("Argument list cannot contain %s", a.Pretty())
|
return nil, fmt.Errorf("Argument list cannot contain %s", a.Pretty())
|
||||||
}
|
}
|
||||||
if argvln == 2 {
|
if argvln == 2 {
|
||||||
opt.Set(argv[1].Val.(string), nil)
|
opt.Set(argv[1].Val.(string), &nilVal)
|
||||||
} else if argvln == 3 {
|
} else if argvln == 3 {
|
||||||
opt.Set(argv[1].Val.(string), argv[2])
|
opt.Set(argv[1].Val.(string), argv[2])
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user