package saccharine import "strings" type stringifyVisitor struct { builder strings.Builder } func (v *stringifyVisitor) VisitVariable(a *Variable) { v.builder.WriteString(a.Name) } func (v *stringifyVisitor) VisitAbstraction(f *Abstraction) { v.builder.WriteRune('\\') v.builder.WriteString(strings.Join(f.Parameters, " ")) v.builder.WriteRune('.') f.Body.Accept(v) } func (v *stringifyVisitor) VisitApplication(c *Application) { v.builder.WriteRune('(') c.Abstraction.Accept(v) for _, argument := range c.Arguments { v.builder.WriteRune(' ') argument.Accept(v) } v.builder.WriteRune(')') } func Stringify(n Node) string { b := &stringifyVisitor{} n.Accept(b) return b.builder.String() }