71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package saccharine
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"git.maximhutz.com/max/lambda/pkg/saccharine/ast"
|
|
)
|
|
|
|
func stringifyAtom(n *ast.Atom) string {
|
|
return n.Name
|
|
}
|
|
|
|
func stringifyAbstraction(n *ast.Abstraction) string {
|
|
return "\\" + strings.Join(n.Parameters, " ") + "." + Stringify(n.Body)
|
|
}
|
|
|
|
func stringifyApplication(n *ast.Application) string {
|
|
arguments := []string{Stringify(n.Abstraction)}
|
|
|
|
for _, argument := range n.Arguments {
|
|
arguments = append(arguments, Stringify(argument))
|
|
}
|
|
|
|
return "(" + strings.Join(arguments, " ") + ")"
|
|
}
|
|
|
|
func stringifyLet(s *ast.LetStatement) string {
|
|
return s.Name + " " + strings.Join(s.Parameters, " ") + " := " + Stringify(s.Body)
|
|
}
|
|
|
|
func stringifyDeclare(s *ast.DeclareStatement) string {
|
|
return Stringify(s.Value)
|
|
}
|
|
|
|
func stringifyStatement(s ast.Statement) string {
|
|
switch s := s.(type) {
|
|
case *ast.DeclareStatement:
|
|
return stringifyDeclare(s)
|
|
case *ast.LetStatement:
|
|
return stringifyLet(s)
|
|
default:
|
|
panic(fmt.Errorf("unknown statement type: %v", s))
|
|
}
|
|
}
|
|
|
|
func stringifyClause(n *ast.Clause) string {
|
|
stmts := ""
|
|
|
|
for _, statement := range n.Statements {
|
|
stmts += stringifyStatement(statement) + "; "
|
|
}
|
|
|
|
return "{ " + stmts + Stringify(n.Returns) + " }"
|
|
}
|
|
|
|
func Stringify(n ast.Expression) string {
|
|
switch n := n.(type) {
|
|
case *ast.Atom:
|
|
return stringifyAtom(n)
|
|
case *ast.Abstraction:
|
|
return stringifyAbstraction(n)
|
|
case *ast.Application:
|
|
return stringifyApplication(n)
|
|
case *ast.Clause:
|
|
return stringifyClause(n)
|
|
default:
|
|
panic(fmt.Errorf("unknown expression type: %T", n))
|
|
}
|
|
}
|