33 lines
678 B
Go
33 lines
678 B
Go
package lambda
|
|
|
|
import "strings"
|
|
|
|
type stringifyVisitor struct {
|
|
builder strings.Builder
|
|
}
|
|
|
|
func (v *stringifyVisitor) VisitVariable(a *Variable) {
|
|
v.builder.WriteString(a.Value)
|
|
}
|
|
|
|
func (v *stringifyVisitor) VisitAbstraction(f *Abstraction) {
|
|
v.builder.WriteRune('\\')
|
|
v.builder.WriteString(f.Parameter)
|
|
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()
|
|
}
|