Files
lambda/pkg/lambda/rename.go
2026-02-09 20:10:40 -05:00

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))
}
}