package debruijn import ( "strconv" "strings" ) type stringifyVisitor struct { builder strings.Builder } func (v *stringifyVisitor) VisitVariable(a *Variable) { v.builder.WriteString(strconv.Itoa(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(')') } // Stringify converts a De Bruijn expression to its string representation. func Stringify(e Expression) string { b := &stringifyVisitor{builder: strings.Builder{}} e.Accept(b) return b.builder.String() }