50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
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)
|
|
}
|