package convert import ( "git.maximhutz.com/max/lambda/pkg/debruijn" "git.maximhutz.com/max/lambda/pkg/lambda" ) // LambdaToDeBruijn converts a lambda expression to De Bruijn index representation. func LambdaToDeBruijn(expr lambda.Expression) debruijn.Expression { return lambdaToDeBruijn(expr, []string{}) } func lambdaToDeBruijn(expr lambda.Expression, context []string) debruijn.Expression { switch e := expr.(type) { case *lambda.Variable: index := findIndex(e.Value(), context) return debruijn.NewVariable(index, e.Value()) case *lambda.Abstraction: newContext := append([]string{e.Parameter()}, context...) body := lambdaToDeBruijn(e.Body(), newContext) return debruijn.NewAbstraction(body) case *lambda.Application: abs := lambdaToDeBruijn(e.Abstraction(), context) arg := lambdaToDeBruijn(e.Argument(), context) return debruijn.NewApplication(abs, arg) default: return nil } } // findIndex returns the De Bruijn index for a variable name in the context. // Returns the index if found, or -1 if the variable is free. func findIndex(name string, context []string) int { for i, v := range context { if v == name { return i } } return -1 }