docs: document remaining packages and simplify AST types (#45)
## Summary - Added doc comments across the codebase: `pkg/lambda`, `pkg/saccharine`, `pkg/codec`, `pkg/engine`, `pkg/iterator`, `pkg/set`, `pkg/convert`, `internal/registry`, and `cmd/lambda`. - Made lambda and saccharine expression structs use public fields instead of getters, matching `go/ast` conventions. - Removed superfluous constructors for saccharine and lambda expression/statement types in favor of struct literals. - Consolidated saccharine token constructors into a single `NewToken` function. - Removed the unused `trace` package. ## Test plan - [x] `go build ./...` passes. - [x] `go test ./...` passes. - [ ] Verify `go doc` output renders correctly for documented packages. Reviewed-on: #45 Co-authored-by: M.V. Hutz <git@maximhutz.me> Co-committed-by: M.V. Hutz <git@maximhutz.me>
This commit was merged in pull request #45.
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
// Package convert defined some standard conversions between various types of
|
||||
// representations.
|
||||
package convert
|
||||
|
||||
import (
|
||||
@@ -8,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 {
|
||||
@@ -19,13 +21,13 @@ func encodeAbstraction(n *saccharine.Abstraction) lambda.Expression {
|
||||
// If the function has no parameters, it is a thunk. Lambda calculus still
|
||||
// requires _some_ parameter exists, so generate one.
|
||||
if len(parameters) == 0 {
|
||||
freeVars := result.GetFree()
|
||||
freeVars := lambda.GetFree(result)
|
||||
freshName := lambda.GenerateFreshName(freeVars)
|
||||
parameters = append(parameters, freshName)
|
||||
}
|
||||
|
||||
for i := len(parameters) - 1; i >= 0; i-- {
|
||||
result = lambda.NewAbstraction(parameters[i], result)
|
||||
result = lambda.Abstraction{Parameter: parameters[i], Body: result}
|
||||
}
|
||||
|
||||
return result
|
||||
@@ -41,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
|
||||
@@ -53,22 +55,22 @@ func reduceLet(s *saccharine.LetStatement, e lambda.Expression) lambda.Expressio
|
||||
if len(s.Parameters) == 0 {
|
||||
value = encodeExpression(s.Body)
|
||||
} else {
|
||||
value = encodeAbstraction(saccharine.NewAbstraction(s.Parameters, s.Body))
|
||||
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())
|
||||
freshVar := lambda.GenerateFreshName(lambda.GetFree(e))
|
||||
|
||||
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 {
|
||||
@@ -110,24 +112,27 @@ func encodeExpression(s saccharine.Expression) lambda.Expression {
|
||||
func decodeExression(l lambda.Expression) saccharine.Expression {
|
||||
switch l := l.(type) {
|
||||
case lambda.Variable:
|
||||
return saccharine.NewAtom(l.Name())
|
||||
return &saccharine.Atom{Name: l.Name}
|
||||
case lambda.Abstraction:
|
||||
return saccharine.NewAbstraction(
|
||||
[]string{l.Parameter()},
|
||||
decodeExression(l.Body()))
|
||||
return &saccharine.Abstraction{
|
||||
Parameters: []string{l.Parameter},
|
||||
Body: decodeExression(l.Body)}
|
||||
case lambda.Application:
|
||||
return saccharine.NewApplication(
|
||||
decodeExression(l.Abstraction()),
|
||||
[]saccharine.Expression{decodeExression(l.Argument())})
|
||||
return &saccharine.Application{
|
||||
Abstraction: decodeExression(l.Abstraction),
|
||||
Arguments: []saccharine.Expression{decodeExression(l.Argument)}}
|
||||
default:
|
||||
panic(fmt.Errorf("unknown expression type: %T", l))
|
||||
}
|
||||
}
|
||||
|
||||
// Lambda2Saccharine converts a pure lambda calculus expression into its
|
||||
// Saccharine counterpart.
|
||||
func Lambda2Saccharine(l lambda.Expression) (saccharine.Expression, error) {
|
||||
return decodeExression(l), nil
|
||||
}
|
||||
|
||||
// Saccharine2Lambda desugars a saccharine expression into pure lambda calculus.
|
||||
func Saccharine2Lambda(s saccharine.Expression) (lambda.Expression, error) {
|
||||
return encodeExpression(s), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user