package saccharine type Node interface { Accept(Visitor) } /** ------------------------------------------------------------------------- */ type Abstraction struct { Parameters []string Body Node } type Application struct { Abstraction Node Arguments []Node } type Variable struct { Name string } /** ------------------------------------------------------------------------- */ func NewAbstraction(parameter []string, body Node) *Abstraction { return &Abstraction{Parameters: parameter, Body: body} } func NewApplication(abstraction Node, arguments []Node) *Application { return &Application{Abstraction: abstraction, Arguments: arguments} } func NewVariable(name string) *Variable { return &Variable{Name: name} } /** ------------------------------------------------------------------------- */ 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) }