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.
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.
## 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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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.
Visitorinterface fromexpression.go.Acceptmethods fromAbstraction,Application, andVariable.AcceptfromExpressioninterface.stringify.goand moveString()logic directly into each type.var _ Expression = (*Type)(nil)).expr.Expressionto embedfmt.Stringerinstead of declaringString() string.Decisions
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
Checklist
<type>/<description>).Closes #36