## Summary - Added doc comments across the codebase: `pkg/lambda`, `pkg/saccharine`, `pkg/codec`, `pkg/engine`, `pkg/iterator`, `pkg/set`, `pkg/convert`, `internal/registry`, and `cmd/lambda`. - Made lambda and saccharine expression structs use public fields instead of getters, matching `go/ast` conventions. - Removed superfluous constructors for saccharine and lambda expression/statement types in favor of struct literals. - Consolidated saccharine token constructors into a single `NewToken` function. - Removed the unused `trace` package. ## Test plan - [x] `go build ./...` passes. - [x] `go test ./...` passes. - [ ] Verify `go doc` output renders correctly for documented packages. Reviewed-on: #45 Co-authored-by: M.V. Hutz <git@maximhutz.me> Co-committed-by: M.V. Hutz <git@maximhutz.me>
19 lines
479 B
Go
19 lines
479 B
Go
package lambda
|
|
|
|
import "fmt"
|
|
|
|
// IsFree returns true if the variable name n occurs free in the expression.
|
|
// This function does not mutate the input expression.
|
|
func IsFree(e Expression, n string) bool {
|
|
switch e := e.(type) {
|
|
case Variable:
|
|
return e.Name == n
|
|
case Abstraction:
|
|
return e.Parameter != n && IsFree(e.Body, n)
|
|
case Application:
|
|
return IsFree(e.Abstraction, n) || IsFree(e.Argument, n)
|
|
default:
|
|
panic(fmt.Errorf("unknown expression type: %v", e))
|
|
}
|
|
}
|