refactor: remove visitor pattern (#37)
## Description The codebase previously used the visitor pattern for traversing lambda calculus expressions. This was a hold-over from avoiding the Go-idiomatic way of handling types. This PR removes the visitor pattern in favor of direct method implementations. - Remove `Visitor` interface from `expression.go`. - Remove `Accept` methods from `Abstraction`, `Application`, and `Variable`. - Remove `Accept` from `Expression` interface. - Delete `stringify.go` and move `String()` logic directly into each type. - Add compile-time interface checks (`var _ Expression = (*Type)(nil)`). - Update `expr.Expression` to embed `fmt.Stringer` instead of declaring `String() string`. ### Decisions - Moved `String()` implementations directly into each expression type rather than using a separate recursive function, as each type's string representation is simple enough to be self-contained. ## Benefits - Simpler, more idiomatic Go code using type methods instead of visitor pattern. - Reduced indirection and fewer files to maintain. - Compile-time interface satisfaction checks catch implementation errors early. ## Checklist - [x] Code follows conventional commit format. - [x] Branch follows naming convention (`<type>/<description>`). - [x] Tests pass (if applicable). - [ ] Documentation updated (if applicable). Closes #36 Reviewed-on: #37 Co-authored-by: M.V. Hutz <git@maximhutz.me> Co-committed-by: M.V. Hutz <git@maximhutz.me>
This commit was merged in pull request #37.
This commit is contained in:
@@ -2,10 +2,14 @@
|
||||
// expression types in the lambda interpreter.
|
||||
package expr
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Expression is the base interface for all evaluatable expression types.
|
||||
// Different evaluation modes (lambda calculus, SKI combinators, typed lambda
|
||||
// calculus, etc.) implement this interface with their own concrete types.
|
||||
type Expression interface {
|
||||
// String returns a human-readable representation of the expression.
|
||||
String() string
|
||||
// The expression should have a human-readable representation.
|
||||
fmt.Stringer
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user