21 lines
427 B
Go
21 lines
427 B
Go
package lambda
|
|
|
|
import "git.maximhutz.com/max/lambda/pkg/set"
|
|
|
|
func GetFreeVariables(e Expression) set.Set[string] {
|
|
switch e := e.(type) {
|
|
case *Variable:
|
|
return set.New(e.Value)
|
|
case *Abstraction:
|
|
vars := GetFreeVariables(e.Body)
|
|
vars.Remove(e.Parameter)
|
|
return vars
|
|
case *Application:
|
|
vars := GetFreeVariables(e.Abstraction)
|
|
vars.Merge(GetFreeVariables(e.Argument))
|
|
return vars
|
|
default:
|
|
return nil
|
|
}
|
|
}
|