feat: lambda expressions are mutable now

This commit is contained in:
2026-02-09 19:52:09 -05:00
parent 08bf248745
commit 9d44f5433c
8 changed files with 67 additions and 98 deletions

View File

@@ -10,7 +10,7 @@ import (
)
func encodeAtom(n *saccharine.Atom) lambda.Expression {
return lambda.NewVariable(n.Name)
return lambda.Variable{Name: n.Name}
}
func encodeAbstraction(n *saccharine.Abstraction) lambda.Expression {
@@ -27,7 +27,7 @@ func encodeAbstraction(n *saccharine.Abstraction) lambda.Expression {
}
for i := len(parameters) - 1; i >= 0; i-- {
result = lambda.NewAbstraction(parameters[i], result)
result = lambda.Abstraction{Parameter: parameters[i], Body: result}
}
return result
@@ -43,7 +43,7 @@ func encodeApplication(n *saccharine.Application) lambda.Expression {
}
for _, argument := range arguments {
result = lambda.NewApplication(result, argument)
result = lambda.Application{Abstraction: result, Argument: argument}
}
return result
@@ -58,19 +58,19 @@ func reduceLet(s *saccharine.LetStatement, e lambda.Expression) lambda.Expressio
value = encodeAbstraction(&saccharine.Abstraction{Parameters: s.Parameters, Body: s.Body})
}
return lambda.NewApplication(
lambda.NewAbstraction(s.Name, e),
value,
)
return lambda.Application{
Abstraction: lambda.Abstraction{Parameter: s.Name, Body: e},
Argument: value,
}
}
func reduceDeclare(s *saccharine.DeclareStatement, e lambda.Expression) lambda.Expression {
freshVar := lambda.GenerateFreshName(e.GetFree())
return lambda.NewApplication(
lambda.NewAbstraction(freshVar, e),
encodeExpression(s.Value),
)
return lambda.Application{
Abstraction: lambda.Abstraction{Parameter: freshVar, Body: e},
Argument: encodeExpression(s.Value),
}
}
func reduceStatement(s saccharine.Statement, e lambda.Expression) lambda.Expression {
@@ -112,15 +112,15 @@ func encodeExpression(s saccharine.Expression) lambda.Expression {
func decodeExression(l lambda.Expression) saccharine.Expression {
switch l := l.(type) {
case lambda.Variable:
return &saccharine.Atom{Name: l.Name()}
return &saccharine.Atom{Name: l.Name}
case lambda.Abstraction:
return &saccharine.Abstraction{
Parameters: []string{l.Parameter()},
Body: decodeExression(l.Body())}
Parameters: []string{l.Parameter},
Body: decodeExression(l.Body)}
case lambda.Application:
return &saccharine.Application{
Abstraction: decodeExression(l.Abstraction()),
Arguments: []saccharine.Expression{decodeExression(l.Argument())}}
Abstraction: decodeExression(l.Abstraction),
Arguments: []saccharine.Expression{decodeExression(l.Argument)}}
default:
panic(fmt.Errorf("unknown expression type: %T", l))
}