feat: lambda expressions are mutable now
This commit is contained in:
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user