diff --git a/ast/ast.go b/ast/ast.go index 0661b96..d4a826c 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -89,13 +89,21 @@ func (ast *AST) Pretty() string { for _, elem := range val.Params { agg = append(agg, elem) } - opt := "" + rest := "" if val.HasRest() { - opt = " . " + *val.Rest + rest = " . " + *val.Rest } // 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() - return "(fn (" + strings.Join(agg, " ") + opt + ") " + body + ")" + return "(fn (" + strings.Join(agg, " ") + rest + opt + ") " + body + ")" } else if ast.Tag == Char { return "#" + string(ast.Val.(rune)) } else if ast.Tag == Table { diff --git a/eval/eval.go b/eval/eval.go index 9e2e817..a84e35a 100644 --- a/eval/eval.go +++ b/eval/eval.go @@ -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()) } if argvln == 2 { - opt.Set(argv[1].Val.(string), nil) + opt.Set(argv[1].Val.(string), &nilVal) } else if argvln == 3 { opt.Set(argv[1].Val.(string), argv[2]) }