package debruijn import ( "fmt" "strings" ) type stringifyVisitor struct { builder strings.Builder } func (v *stringifyVisitor) VisitVariable(a *Variable) { if a.label != "" { v.builder.WriteString(a.label) } else { v.builder.WriteString(fmt.Sprintf("%d", a.index)) } } func (v *stringifyVisitor) VisitAbstraction(f *Abstraction) { v.builder.WriteRune('\\') v.builder.WriteRune('.') f.body.Accept(v) } func (v *stringifyVisitor) VisitApplication(c *Application) { v.builder.WriteRune('(') c.abstraction.Accept(v) v.builder.WriteRune(' ') c.argument.Accept(v) v.builder.WriteRune(')') } func Stringify(e Expression) string { b := &stringifyVisitor{builder: strings.Builder{}} e.Accept(b) return b.builder.String() }