45 lines
594 B
Go
45 lines
594 B
Go
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)
|
|
}
|