63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package lambda
|
|
|
|
type Expression interface {
|
|
Accept(Visitor)
|
|
Copy() Expression
|
|
}
|
|
|
|
type Abstraction struct {
|
|
Parameter string
|
|
Body Expression
|
|
}
|
|
|
|
func (a *Abstraction) Copy() Expression {
|
|
return NewAbstraction(a.Parameter, a.Body.Copy())
|
|
}
|
|
|
|
func (a *Abstraction) Accept(v Visitor) {
|
|
v.VisitAbstraction(a)
|
|
}
|
|
|
|
func NewAbstraction(parameter string, body Expression) *Abstraction {
|
|
return &Abstraction{Parameter: parameter, Body: body}
|
|
}
|
|
|
|
type Application struct {
|
|
Abstraction Expression
|
|
Argument Expression
|
|
}
|
|
|
|
func (a *Application) Copy() Expression {
|
|
return NewApplication(a.Abstraction.Copy(), a.Argument.Copy())
|
|
}
|
|
|
|
func (a *Application) Accept(v Visitor) {
|
|
v.VisitApplication(a)
|
|
}
|
|
|
|
func NewApplication(function Expression, argument Expression) *Application {
|
|
return &Application{Abstraction: function, Argument: argument}
|
|
}
|
|
|
|
type Variable struct {
|
|
Value string
|
|
}
|
|
|
|
func (v *Variable) Copy() Expression {
|
|
return NewVariable(v.Value)
|
|
}
|
|
|
|
func (v *Variable) Accept(visitor Visitor) {
|
|
visitor.VisitVariable(v)
|
|
}
|
|
|
|
func NewVariable(name string) *Variable {
|
|
return &Variable{Value: name}
|
|
}
|
|
|
|
type Visitor interface {
|
|
VisitAbstraction(*Abstraction)
|
|
VisitApplication(*Application)
|
|
VisitVariable(*Variable)
|
|
}
|