32 lines
748 B
Go
32 lines
748 B
Go
package lambda
|
|
|
|
import "fmt"
|
|
|
|
// Rename replaces all occurrences of the target variable name with the new name.
|
|
func Rename(e Expression, target string, newName string) Expression {
|
|
switch e := e.(type) {
|
|
case Variable:
|
|
if e.Name == target {
|
|
return Variable{Name: newName}
|
|
}
|
|
|
|
return e
|
|
case Abstraction:
|
|
newParam := e.Parameter
|
|
if e.Parameter == target {
|
|
newParam = newName
|
|
}
|
|
|
|
newBody := Rename(e.Body, target, newName)
|
|
|
|
return Abstraction{Parameter: newParam, Body: newBody}
|
|
case Application:
|
|
newAbs := Rename(e.Abstraction, target, newName)
|
|
newArg := Rename(e.Argument, target, newName)
|
|
|
|
return Application{Abstraction: newAbs, Argument: newArg}
|
|
default:
|
|
panic(fmt.Errorf("unknown expression type: %v", e))
|
|
}
|
|
}
|