package ast import ( "fmt" "strings" ) type AST struct { Tag Tag Val interface{} } type Tag int8 const ( Symbol Tag = iota List String Num Bool ) func (tag Tag) String() string { names := []string{ "Symbol", "List", "String", "Num", "Bool", } return names[tag] } func (ast AST) Pretty() string { if ast.Tag == List { var agg []string for _, elem := range(ast.Val.([]AST)) { agg = append(agg, elem.Pretty()) } return "(" + strings.Join(agg, " ") + ")" } return fmt.Sprintf("%v", ast.Val) }