feat: stuff
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package saccharine
|
||||
|
||||
type Node interface {
|
||||
IsNode()
|
||||
Accept(Visitor)
|
||||
}
|
||||
|
||||
/** ------------------------------------------------------------------------- */
|
||||
@@ -36,6 +36,14 @@ func NewVariable(name string) *Variable {
|
||||
|
||||
/** ------------------------------------------------------------------------- */
|
||||
|
||||
func (_ Abstraction) IsNode() {}
|
||||
func (_ Application) IsNode() {}
|
||||
func (_ Variable) IsNode() {}
|
||||
func (a *Abstraction) Accept(x Visitor) { x.VisitAbstraction(a) }
|
||||
func (a *Application) Accept(x Visitor) { x.VisitApplication(a) }
|
||||
func (v *Variable) Accept(x Visitor) { x.VisitVariable(v) }
|
||||
|
||||
/** ------------------------------------------------------------------------- */
|
||||
|
||||
type Visitor interface {
|
||||
VisitAbstraction(*Abstraction)
|
||||
VisitApplication(*Application)
|
||||
VisitVariable(*Variable)
|
||||
}
|
||||
|
||||
36
pkg/saccharine/stringify.go
Normal file
36
pkg/saccharine/stringify.go
Normal file
@@ -0,0 +1,36 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user