47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package normalorder
|
|
|
|
import (
|
|
"git.maximhutz.com/max/lambda/pkg/emitter"
|
|
"git.maximhutz.com/max/lambda/pkg/lambda"
|
|
"git.maximhutz.com/max/lambda/pkg/repr"
|
|
"git.maximhutz.com/max/lambda/pkg/runtime"
|
|
)
|
|
|
|
// NormalOrderReducer implements normal order (leftmost-outermost) reduction
|
|
// for lambda calculus expressions.
|
|
type Runtime struct {
|
|
emitter.BaseEmitter[runtime.Event]
|
|
expression lambda.Expression
|
|
}
|
|
|
|
// NewNormalOrderReducer creates a new normal order reducer.
|
|
func NewRuntime(expression lambda.Expression) *Runtime {
|
|
return &Runtime{
|
|
BaseEmitter: *emitter.New[runtime.Event](),
|
|
expression: expression,
|
|
}
|
|
}
|
|
|
|
// Expression returns the current expression state.
|
|
func (r *Runtime) Expression() repr.Repr {
|
|
return r.expression
|
|
}
|
|
|
|
func (r *Runtime) Step() bool {
|
|
result, done := ReduceOnce(r.expression)
|
|
r.expression = result
|
|
return !done
|
|
}
|
|
|
|
// Reduce performs normal order reduction on a lambda expression.
|
|
// The expression must be a lambda.Expression; other types are returned unchanged.
|
|
func (r *Runtime) Run() {
|
|
r.Emit(runtime.StartEvent)
|
|
|
|
for !r.Step() {
|
|
r.Emit(runtime.StepEvent)
|
|
}
|
|
|
|
r.Emit(runtime.StopEvent)
|
|
}
|