# Lumbda **A Lisp/Scheme-derived, just-in-time lambda language. Four implementation tiers with MOAD defect isolation. Workloads migrate across basic UNIX systems.** Four implementation tiers sharing one wire format — Scheme source itself: - **Python bytecode VM** — reference, full first-class continuations - **C tree-walker + bytecode VM** — portable C, JSON portal - **C + x86_64 JIT** — pattern-matched native code, 7–10× faster than CPython - **Pure x86_64 assembly** — 22 KB stripped, zero libc, 14 syscalls Feedback is the primitive across four scopes: continuations within a process, portal files across processes, S-expressions across implementations, TCP sockets across machines. Home: [lumbda.com](https://lumbda.com) ``` λ> (define (fib n) (let loop ((a 0) (b 1) (i 0)) (if (= i n) a (loop b (+ a b) (+ i 1))))) λ> (map fib (iota 10)) (0 1 1 2 3 5 8 13 21 34) ``` ## Usage ```bash python3 lumbda.py # interactive REPL python3 lumbda.py script.lsp # run a file python3 lumbda.py -e '(+ 1 2)' # eval an expression python3 lumbda.py --fast script.lsp # auto-compile (7-19x faster) ``` ## Bytecode compiler Lumbda includes a stack-based bytecode compiler and VM. Enable it with `--fast` or `(auto-compile! #t)`: ```bash python3 lumbda.py --fast examples/fibonacci.lsp ``` ```scheme (auto-compile! #t) (define (ack m n) (cond ((= m 0) (+ n 1)) ((= n 0) (ack (- m 1) 1)) (else (ack (- m 1) (ack m (- n 1)))))) (compiled? ack) ; => #t (ack 3 4) ; => 125 ``` The compiler handles: `if`, `begin`, `and`, `or`, `when`, `unless`, `cond`, `define`, `set!`, `lambda`, `let`, named-let, `let*`, `letrec`, `do`, `call/cc`, function calls with tail-call optimization. Macros are expanded at compile time. 20 specialized opcodes for hot builtins (`+`, `-`, `*`, `=`, `<`, `car`, `cdr`, `cons`, `null?`, etc.) avoid function call overhead. Features: - **Explicit frame stack** — compiled-to-compiled calls don't grow the Python stack - **Full continuations** — `call/cc` supports upward continuations; generators work - **Constant folding** — `(+ 1 2)` folds to `3` at compile time - **Peephole optimizer** — eliminates dead code (VOID+POP, JUMP-to-next) - **`(disassemble proc)`** — inspect generated bytecode ## What's implemented **Core language** - Full lexical scoping and closures - Tail-call optimization (TCO) — deep recursion never blows the stack - Hygienic macros via `syntax-rules` with ellipsis (`...`) support - `define-macro` / `defmacro` for procedural macros - `call/cc` — full continuations (escape + upward) in compiled code - `values` / `call-with-values` - `dynamic-wind`, `guard`, `with-exception-handler` - `quasiquote` / `unquote` / `unquote-splicing` with proper nesting - R7RS internal defines with letrec* body semantics - R7RS error objects - Exact rational arithmetic — `(/ 1 3)` → `1/3`, `(+ 1/4 3/4)` → `1` - String ports — `open-input-string` `open-output-string` `read` on ports - Mutable strings — `string-set!` `string-fill!` `string-copy!` - Module system — `module` / `import` with export lists - `define-record-type` with `(inherit parent)` for single-inheritance - Pretty-print — `pp` / `pretty-print` - Tracing — `(trace fn)` / `(untrace fn)` **Special forms** `define` `set!` `lambda` `λ` `if` `cond` `case` `and` `or` `when` `unless` `begin` `let` `let*` `letrec` `letrec*` named-let `do` `quasiquote` `define-macro` `define-syntax` `syntax-rules` `let-syntax` `letrec-syntax` `apply` `eval` `values` `call/cc` `dynamic-wind` `guard` `parameterize` `load` `error` `module` `import` `define-record-type` **Built-ins** - Arithmetic: `+` `-` `*` `/` `quotient` `remainder` `modulo` `expt` `sqrt` `abs` `floor` `ceiling` `round` `truncate` `min` `max` `gcd` `lcm` `log` `exp` trig functions, `numerator` `denominator` - Rationals: `(/ 1 3)` → `1/3`, literal `1/3` syntax, `exact` / `inexact` conversion - Comparison: `=` `<` `>` `<=` `>=` `zero?` `positive?` `negative?` `odd?` `even?` - Pairs & lists: `cons` `car` `cdr` `list` `length` `append` `reverse` `map` `for-each` `filter` `fold-left` `fold-right` `reduce` `any` `every` `sort` `partition` `find` `take` `drop` `zip` `flatten` and more - SRFI-1: `last` `first`–`fifth` `delete` `lset-union` `lset-intersection` `lset-difference` `unfold` `list-tabulate` - Strings: `string-length` `string-ref` `string-set!` `substring` `string-append` `string-copy` `string-copy!` `string-fill!` `string->list` `string->number` `format` and more - Characters: `char->integer` `integer->char` `char-alphabetic?` `char-upcase` `char-downcase` - Vectors: `make-vector` `vector` `vector-ref` `vector-set!` `vector-copy` `vector-copy!` - Hash tables: `make-hash-table` `hash-table-set!` `hash-table-ref` `hash-table-keys` `hash-table-values` `hash-table-walk` and more - I/O: `display` `write` `newline` `read` `read-char` `read-line` `open-input-string` `open-output-string` `with-output-to-string` - File system: `file-exists?` `delete-file` `rename-file` `directory-files` `current-directory` - System: `command-line` `get-environment-variable` `current-time` `exit` - Python interop: `py-eval` `py-exec` `py-import` `py-call` `py-attr` - Compiler: `compile` `compiled?` `disassemble` `auto-compile!` **Standard library** (`stdlib.lsp`) Additional macros, string/list/numeric/tree utilities, alist/hash helpers, simple object system, SRFI-2/8/64 test framework. ## Examples ```bash python3 lumbda.py --fast examples/fibonacci.lsp python3 lumbda.py --fast examples/generator.lsp python3 lumbda.py --fast examples/mergesort.lsp python3 lumbda.py examples/objects.lsp ``` ```scheme ;; Generator using full continuations (auto-compile! #t) (define (make-gen thunk) (let ((k #f) (done #f)) (lambda () (if done 'done (call/cc (lambda (return) (if k (k return) (begin (thunk (lambda (val) (call/cc (lambda (next) (set! k next) (return val))))) (set! done #t) (return 'done))))))))) (define counter (make-gen (lambda (yield) (let loop ((i 0)) (yield i) (loop (+ i 1)))))) (counter) ; => 0 (counter) ; => 1 (counter) ; => 2 ``` ## Running tests & benchmarks ```bash make test # run 529 tests make test-verbose # verbose output make bench # compare interpreter vs bytecode vs CPython make lint # syntax check all Python files ``` ## Portal — machine state migration Serialize a running VM mid-computation, transfer to another machine, resume: ```bash # Machine A: start a long computation with checkpoints python3 lumbda.py --fast examples/portal-prime.lsp # saves prime-state.portal at checkpoint # Machine B: resume from checkpoint python3 lumbda.py --portal-resume prime-state.portal # continues from exact instruction ``` The portal captures the full env chain, compiled procedures, continuations, and frame stack as JSON. 16KB for a primality test in progress. ## EML universality proof The `proof/` directory contains a formal verification that `eml(x,y) = exp(x) - ln(y)` with constant 1 generates all elementary functions (arXiv:2603.21852v2). Three approaches, benchmarked: | Approach | Time | Guarantee | |----------|------|-----------| | Python (numerical) | 0.04s | 1e-10 tolerance | | Lumbda (numerical) | 59s | 1e-10 tolerance | | Lean 4 (formal proof) | 1.5s | kernel-verified | The formal proof is 40x faster than brute-force search with infinitely stronger guarantees. See `proof/benchmark_results.md` for the full analysis — including why this is MOAD-0001 (the sedimentary defect) at the proof methodology layer. ## File layout ``` lumbda.py interpreter + bytecode compiler (one file, ~3200 lines) stdlib.lsp extended standard library tests.py test suite (571 tests) bench.py benchmarks vs CPython examples/ example programs proof/ EML universality proof (Python, Scheme, Lean 4) Makefile make test / make bench / make repl ```