The Problem
Lamb is a minimal functional language implementation in a single C file with no build system, no tests, and no automation. It works as demonstrated but provides zero guardrails for production or serious development use. There is no way to verify correctness, no CI to catch regressions, and no structured onboarding beyond the README.
What This Does
The repository implements a Turing-complete lambda calculus interpreter in lamb.c (1 file, ~2,200 lines) with normal-order reduction, let-binding, and magic primitives #trace and #void for debugging. Standard library definitions live in std.lamb. The parser accepts the .lamb syntax documented in README.md: variable bindings (xs = ...), function application, and parenthesized expressions. Three PNG assets in assets/ are logos only—no other assets, no documentation beyond the README.
Two doc files exist: README.md and std.lamb. No other documentation, no man page, no inline comments in lamb.c beyond what the README references.
How To Use It
Build and run exactly as the README states:
$ cc -o lamb lamb.c $ ./lamb ./std.lamb
Or use rlwrap for line editing:
$ rlwrap ./lamb
No Makefile, CMakeLists.txt, or package.json exists. The only entry point is lamb.c compiled to lamb. Passing ./std.lamb as an argument loads the standard library; running without args enters REPL mode.
Real-World Use
This is a learning toy or prototyping tool. Someone could use it to experiment with lambda calculus semantics, teach reduction strategies, or prototype tiny DSLs embedded in C. The #trace magic makes it tolerable for debugging small expressions, but there is no REPL history persistence, no pretty-printing beyond what the parser outputs, and no way to save or load user-defined environments beyond what the binding syntax provides.
Code Health & Issues
No test files - lamb.c contains the interpreter, parser, and REPL loop with zero automated tests. Any change to the reduction strategy or parser is untested by default. No CI/CD - No .github/workflows, no Makefile, no CI config. The only quality gate is manual compilation and execution. Single-file C implementation - lamb.c handles lexing, parsing, reduction, and REPL in one translation unit. No separation of concerns, no modular boundaries, and no way to embed the interpreter programmatically without pulling in the whole file. No input validation beyond parsing - The parser accepts any alphanumeric token as a variable name (including 69420), and the interpreter does not validate argument counts or handle errors gracefully beyond printing RESULT: or trace output. No license file detected - The LICENSE file exists at root, but its contents were not included in the file listing; verify compliance before reuse. No environment configuration - No .env, config.yaml, or runtime flags beyond the optional std.lamb argument.
The Bottom Line
Lamb is a capable, minimal lambda calculus interpreter that works exactly as documented. It is not a production runtime, an embeddable library, or a serious language implementation. It is best suited as a sandbox for learning lambda calculus semantics or prototyping tiny functional constructs in C. If you need a battle-tested functional language, look elsewhere. If you want to study reduction strategies or experiment with a tiny functional toy, this is serviceable with the caveat that any production use will require building testing, CI, and error-handling infrastructure from scratch.