refactor: make lambda expression types immutable

- Change Abstraction, Application, and Variable to use private fields with getter methods
- Return value types instead of pointers from constructors
- Update all type switches to match value types instead of pointer types
- Remove pointer equality optimizations (not applicable with immutable values)
- Return empty set instead of nil from GetFreeVariables default case
This commit is contained in:
2026-01-17 16:29:24 -05:00
parent c2aa77cb92
commit 7318c0dac4
21 changed files with 191 additions and 255 deletions

View File

@@ -0,0 +1,27 @@
// Package interpreter provides the abstract Reducer interface for all expression
// reduction strategies.
package interpreter
import (
"git.maximhutz.com/max/lambda/pkg/emitter"
"git.maximhutz.com/max/lambda/pkg/expr"
)
// Reducer defines the interface for expression reduction strategies.
// Different evaluation modes (normal order, applicative order, SKI combinators,
// etc.) implement this interface with their own reduction logic.
//
// Reducers also implement the Emitter interface to allow plugins to observe
// reduction lifecycle events (Start, Step, Stop).
type Interpreter interface {
emitter.Emitter[Event]
// Run a single step. Returns whether the interpreter is complete or not.
Step() bool
// Run until completion.
Run()
// Expression returns the current expression state.
Expression() expr.Expression
}