Files
lambda/pkg/lambda/expression.go
2026-01-10 16:07:39 -05:00

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)
}