From 4d81aca0b2eeb9e73d130835e509c57e57c0e069 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 28 Dec 2025 00:53:43 -0500 Subject: [PATCH] feat: fun little program --- Makefile | 5 +++- cmd/lambda/lambda.go | 5 ++++ pkg/saccharine/parser.go | 2 +- samples/saccharine.txt | 59 +++++++++++++++++++++++++++++++--------- 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index db2ace9..8e821b5 100644 --- a/Makefile +++ b/Makefile @@ -11,4 +11,7 @@ thunk: it @ ./lambda.exe - < ./samples/thunk.txt saccharine: it - @ ./lambda.exe -x - < ./samples/saccharine.txt \ No newline at end of file + @ ./lambda.exe - < ./samples/saccharine.txt + +saccharineX: it + @ ./lambda.exe -x - < ./samples/saccharine.txt > saccharine.out \ No newline at end of file diff --git a/cmd/lambda/lambda.go b/cmd/lambda/lambda.go index 43389ec..bbc9242 100644 --- a/cmd/lambda/lambda.go +++ b/cmd/lambda/lambda.go @@ -44,15 +44,20 @@ func main() { fmt.Println(lambda.Stringify(compiled)) } + steps := 0 + for lambda.ReduceOnce(&compiled) { logger.Info("reduction", "tree", lambda.Stringify(compiled)) if options.Explanation { fmt.Println(" =", lambda.Stringify(compiled)) } + steps++ } elapsed := time.Since(start).Milliseconds() fmt.Println(lambda.Stringify(compiled)) fmt.Fprintln(os.Stderr, "Time Spent:", elapsed, "ms") + fmt.Fprintln(os.Stderr, "Steps:", steps) + fmt.Fprintln(os.Stderr, "Speed:", float32(steps)/(float32(elapsed)/1000), "ops") } diff --git a/pkg/saccharine/parser.go b/pkg/saccharine/parser.go index 08899a9..e0d3cb8 100644 --- a/pkg/saccharine/parser.go +++ b/pkg/saccharine/parser.go @@ -149,7 +149,7 @@ func parseClause(i *TokenIterator, braces bool) (*ast.Clause, error) { } else if len(stmts) == 0 { return nil, fmt.Errorf("no statements in clause") } else if last, ok = stmts[len(stmts)-1].(*ast.DeclareStatement); !ok { - return nil, fmt.Errorf("this clause contains no final return value") + return nil, fmt.Errorf("this clause contains no final return value (col %d)", i.MustGet().Column) } if braces { diff --git a/samples/saccharine.txt b/samples/saccharine.txt index e9fb362..10584cf 100644 --- a/samples/saccharine.txt +++ b/samples/saccharine.txt @@ -1,19 +1,52 @@ -true x y := x -false x y := y +T x y := x +F x y := y +if b t e := (b t e) pair a b := \c.(c a b) -left p := (p true) -false p := (p false) +left p := (p T) +right p := (p F) -zero 0 1 x := x print n := (n 0 1 end) -inc n := \0 1 x.{ - initial := (pair true x) - onZero p := (pair false ((left p 1 0) (right p))) - onOne p := (pair (left p) (1 (right p))) - - (n onZero onOne initial) -} +fix f := (\x.(f (x x)) \x.(f (x x))) -(print zero) +some x := (pair T x) +none := \.F +isfull := left +unwrap := right + +nil := none +push i l := (some (pair i l)) +peek l := (left (unwrap l)) +pop l := (right (unwrap l)) + +inc := (fix \self l.{ + (if (isfull l) + (if (peek l) + (push F (self (pop l))) + (push T (pop l)) + ) + (push T nil) + ) +}) + +print := (fix \self l.{ + (if (isfull l) + ((if (peek l) 1 0) (self (pop l))) + END + ) +}) + +one := (push T nil) +double N := (push F N) + +N := + (double (double (double (double (double + (double (double (double (double (double + (double (double (double (double (double + (double (double (double (double (double + (double (double (double (double (double + (double (double (double (double (double + one)))))))))))))))))))))))))))))) + +(print N)