From f7352b51b0068ef4c67c1278a45e91b71fc12819 Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Sun, 19 Apr 2026 10:20:11 -0400 Subject: [PATCH] rename: uncommonlisp -> lumbda throughout the repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Historical internal name "uncommonlisp" retired in favor of the public name "lumbda" ahead of lumbda.com going live. Scope of this commit: Source files renamed: uncommonlisp.py -> lumbda.py asm/uncommonlisp.s -> asm/lumbda.s c/uncommonlisp.h -> c/lumbda.h whitepaper/uncommonlisp-whitepaper -> whitepaper/lumbda-whitepaper (.rst + .pdf) Binaries renamed (tracked ones; c/ was always gitignored): asm/uncommonlisp, asm/uncommonlisp-gc, asm/uncommonlisp.o, asm/uncommonlisp-gc.o -> asm/lumbda(-gc)(.o) c/.gitignore -> ignores lumbda Internal string updates (sed pass ordered longest-first): asm/uncommonlisp -> asm/lumbda c/uncommonlisp -> c/lumbda uncommonlisp.py -> lumbda.py UNCOMMONLISP_BIN -> LUMBDA_BIN (asm/test.sh env var) "uncommonlisp> " -> "lumbda> " (asm REPL prompt baked into binary) UNCOMMONLISP -> LUMBDA (macros, comments) uncommonlisp -> lumbda (prose) Binary portal magic updated: "ULPORTAL" -> "LUMBDAB1" # "Lumbda Binary v1" Old portal files are not backward-compatible — this is a deliberate break since it's the rename moment. S-expression portals already carry their own ";; lumbda-portal v1" header and remain cleanly versioned. WHITEPAPER.pdf / WHITEPAPER.rst symlinks repointed to the renamed files. Makefile's whitepaper target targets lumbda-whitepaper.pdf. Not changed (intentional, separate phases): - Filesystem directory /home/fox/git/uncommonlisp itself (fox renames locally and the gitlab repo URL in a follow-up) - tests.py hardcoded cwd=/home/fox/git/uncommonlisp (matches the current on-disk location; will flip when the directory rename ships) - Git history (immutable; old commits still say uncommonlisp, which is correct — that's what they were) Verified: 137 asm no-GC + 137 asm GC + 571 Python + 83 C + 189 shared functional tests all pass under the new names. bench-gc-http (2000 req): all 4 cells behave as expected (cells 1/2 flat, 3 leaks, 4 bounded at 1 chunk). Python REPL, C REPL, asm REPL all start cleanly. --- CLAUDE.md | 24 +-- Makefile | 44 ++--- README.md | 24 +-- asm/Makefile | 22 +-- asm/lumbda | Bin 0 -> 51296 bytes asm/lumbda-gc | Bin 0 -> 59944 bytes asm/{uncommonlisp-gc.o => lumbda-gc.o} | Bin 62576 -> 62568 bytes asm/lumbda.o | Bin 0 -> 53352 bytes asm/{uncommonlisp.s => lumbda.s} | 6 +- asm/test.sh | 6 +- asm/uncommonlisp | Bin 51208 -> 0 bytes asm/uncommonlisp-gc | Bin 59960 -> 0 bytes asm/uncommonlisp.o | Bin 53256 -> 0 bytes bench.py | 8 +- c/.gitignore | 2 +- c/Makefile | 12 +- c/TODO-named-let-bytecode.md | 4 +- c/bench.c | 4 +- c/builtins.c | 4 +- c/eval.c | 2 +- c/jit.c | 4 +- c/jit.h | 4 +- c/{uncommonlisp.h => lumbda.h} | 10 +- c/main.c | 16 +- c/portal.c | 6 +- c/printer.c | 2 +- c/reader.c | 2 +- c/test.c | 4 +- c/types.c | 2 +- c/vm.c | 4 +- docs/README.md | 6 +- docs/c-architecture.dot | 2 +- examples/bench-hashset.lsp | 2 +- examples/fibonacci.lsp | 2 +- examples/generator.lsp | 2 +- examples/http-client-bench.lsp | 6 +- examples/http-server-noarena.lsp | 2 +- examples/http-server.lsp | 10 +- examples/mergesort.lsp | 2 +- examples/objects.lsp | 4 +- examples/portal-http-client.lsp | 6 +- examples/portal-http-server.lsp | 10 +- examples/portal-prime.lsp | 4 +- examples/proof-netspace-client.lsp | 6 +- examples/proof-netspace-server.lsp | 6 +- examples/repl-server.lsp | 6 +- examples/rpc-client.lsp | 6 +- examples/rpc-relay.lsp | 6 +- examples/rpc-server.lsp | 6 +- examples/spiral-client.lsp | 2 +- examples/spiral-demo.sh | 6 +- friction.sh | 36 ++-- uncommonlisp.py => lumbda.py | 32 ++-- proof/benchmark.sh | 8 +- proof/benchmark_results.md | 4 +- proof/eml_proof.lsp | 8 +- proof/eml_proof_in_lumbda.lsp | 6 +- stdlib.lsp | 4 +- tests.py | 20 +-- tests/bench-3way.sh | 6 +- tests/bench-gc-adaptive.sh | 6 +- tests/bench-gc-arena.sh | 6 +- tests/bench-gc-http.sh | 8 +- tests/bench-gc-memory.sh | 8 +- tests/bench-hashset.sh | 12 +- tests/bench-proof.sh | 16 +- tests/functional.lsp | 10 +- tests/portal-benchmark.sh | 6 +- tests/portal-cross-test.sh | 6 +- tests/portal-exchange.lsp | 2 +- tests/portal-formats.lsp | 8 +- tests/rpc-chain-bench.sh | 12 +- tests/web-benchmark.sh | 36 ++-- whitepaper/WHITEPAPER.pdf | 2 +- whitepaper/WHITEPAPER.rst | 2 +- ...p-whitepaper.pdf => lumbda-whitepaper.pdf} | 166 +++++++++--------- ...p-whitepaper.rst => lumbda-whitepaper.rst} | 18 +- 77 files changed, 383 insertions(+), 383 deletions(-) create mode 100755 asm/lumbda create mode 100755 asm/lumbda-gc rename asm/{uncommonlisp-gc.o => lumbda-gc.o} (79%) create mode 100644 asm/lumbda.o rename asm/{uncommonlisp.s => lumbda.s} (99%) delete mode 100755 asm/uncommonlisp delete mode 100755 asm/uncommonlisp-gc delete mode 100644 asm/uncommonlisp.o rename c/{uncommonlisp.h => lumbda.h} (99%) rename uncommonlisp.py => lumbda.py (99%) rename whitepaper/{uncommonlisp-whitepaper.pdf => lumbda-whitepaper.pdf} (99%) rename whitepaper/{uncommonlisp-whitepaper.rst => lumbda-whitepaper.rst} (98%) diff --git a/CLAUDE.md b/CLAUDE.md index 13ea6bd..a926c91 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # Agent Blackops — Lumbda repo -This repo is operated by **agent blackops** — ml agent for fox/timehexon on the unsandbox/unturf/permacomputer platform. **Lumbda** is the language (home: lumbda.com); the repo directory and binaries still use the historical name `uncommonlisp` until the filesystem rename ships in a later phase. +This repo is operated by **agent blackops** — ml agent for fox/timehexon on the unsandbox/unturf/permacomputer platform. **Lumbda** is the language (home: lumbda.com); the repo directory and binaries still use the historical name `lumbda` until the filesystem rename ships in a later phase. ## Identity @@ -39,7 +39,7 @@ Then ask fox what the mission is. | Impl | Path | Build | Test | REPL | |------|------|-------|------|------| -| Python | `uncommonlisp.py` | — | `make test` | `make repl` | +| Python | `lumbda.py` | — | `make test` | `make repl` | | C | `c/` | `make c-build` | `make c-test` | `make c-repl` | | Assembly | `asm/` | `make asm-build` | `make asm-test` | `make asm-repl` | | All | — | — | `make test-all` | — | @@ -75,22 +75,22 @@ crash is not just "my problem" — it takes their state down too. The rules below are belt, suspenders, AND a parachute so that even if two safeguards fail, the kernel itself backstops. -**MANDATORY pattern — every asm/uncommonlisp test in a shell block:** +**MANDATORY pattern — every asm/lumbda test in a shell block:** ```bash set -e # (1) fail-fast ulimit -v 524288 # (2) KERNEL CAP: 512 MB virt # process gets SIGKILL at cap, no matter what -trap 'pkill -9 -u "$USER" -f "examples/http-server|asm/uncommonlisp" 2>/dev/null || true' \ +trap 'pkill -9 -u "$USER" -f "examples/http-server|asm/lumbda" 2>/dev/null || true' \ EXIT INT TERM # (3) cleanup always fires -timeout 30 asm/uncommonlisp < server.lsp & # (4) wall-clock ceiling +timeout 30 asm/lumbda < server.lsp & # (4) wall-clock ceiling SPID=$! # ... do the work (curl requests, measurements, etc.) ... kill -9 $SPID 2>/dev/null; wait $SPID 2>/dev/null # (5) explicit cleanup # (6) VERIFY the block is clean before moving on -pgrep -u "$USER" -f 'asm/uncommonlisp|examples/http-server' \ +pgrep -u "$USER" -f 'asm/lumbda|examples/http-server' \ && { echo "STRAGGLER"; exit 1; } || true ``` @@ -108,12 +108,12 @@ Additional rules: in `examples/http-server.lsp`). Never raise for long-running tests. - Use `pkill -u "$USER" -f ` not `pkill` alone — others may have their own processes on this machine. -- Prefer FOREGROUND runs when possible: `timeout 10 asm/uncommonlisp +- Prefer FOREGROUND runs when possible: `timeout 10 asm/lumbda < test.lsp` with the `.lsp` exiting on its own beats backgrounding. - C has Boehm GC via `GC_MALLOC`. Python has Python's GC. Asm has neither. Risk scales with how long the asm process lives. - If `ulimit` is unavailable (some container setups), use - `systemd-run --user --scope -p MemoryMax=512M -- asm/uncommonlisp ...` + `systemd-run --user --scope -p MemoryMax=512M -- asm/lumbda ...` as the equivalent cgroup-based cap. ## MOAD Scanner @@ -122,10 +122,10 @@ Additional rules: ```bash cd ~/git/unmoadner && make all -./unmoad ~/git/uncommonlisp/ # scan entire repo -./unmoad ~/git/uncommonlisp/asm/ # scan assembly only -./unmoad ~/git/uncommonlisp/c/ # scan C only -./unmoad ~/git/uncommonlisp/*.py # scan Python only +./unmoad ~/git/lumbda/ # scan entire repo +./unmoad ~/git/lumbda/asm/ # scan assembly only +./unmoad ~/git/lumbda/c/ # scan C only +./unmoad ~/git/lumbda/*.py # scan Python only ``` **MANDATORY before committing new code:** run `unmoad` on changed files. diff --git a/Makefile b/Makefile index d48ed2a..306235f 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ # ═══════════════════════════════════════════════════════════════════ -# uncommonlisp — Python + C + Assembly implementations +# lumbda — Python + C + Assembly implementations # ═══════════════════════════════════════════════════════════════════ # # Implementations: -# Python uncommonlisp.py bytecode VM, full continuations, portal -# C c/uncommonlisp tree-walker + bytecode VM + x86_64 JIT -# Assembly asm/uncommonlisp pure x86_64, no libc, 13KB binary +# Python lumbda.py bytecode VM, full continuations, portal +# C c/lumbda tree-walker + bytecode VM + x86_64 JIT +# Assembly asm/lumbda pure x86_64, no libc, 13KB binary # # Test suites: # make test Python unit/integration (571 tests) @@ -50,10 +50,10 @@ bench-verbose: python3 bench.py -v repl: - python3 uncommonlisp.py + python3 lumbda.py lint: - python3 -m py_compile uncommonlisp.py + python3 -m py_compile lumbda.py python3 -m py_compile tests.py python3 -m py_compile bench.py @@ -65,13 +65,13 @@ c-build: c-test: c-build $(MAKE) -C c test @echo "── C functional tests (shared .lsp suite) ──" - ./c/uncommonlisp tests/functional.lsp + ./c/lumbda tests/functional.lsp c-bench: c-build $(MAKE) -C c bench c-repl: c-build - ./c/uncommonlisp + ./c/lumbda c-clean: $(MAKE) -C c clean @@ -85,7 +85,7 @@ asm-test: asm-build $(MAKE) -C asm test asm-repl: asm-build - ./asm/uncommonlisp + ./asm/lumbda asm-clean: $(MAKE) -C asm clean @@ -95,9 +95,9 @@ asm-clean: functional-test: c-build @echo "═══ Shared functional tests (114 tests) ═══" @echo "── Python ──" - @python3 uncommonlisp.py --fast tests/functional.lsp | tail -3 + @python3 lumbda.py --fast tests/functional.lsp | tail -3 @echo "── C ──" - @./c/uncommonlisp tests/functional.lsp | tail -3 + @./c/lumbda tests/functional.lsp | tail -3 test-all: test c-test asm-test functional-test @echo "════════════════════════════════════════════════════" @@ -147,16 +147,16 @@ bench-all: bench c-bench bench-3way bench-portal bench-portal-cross bench-web be examples: c-build @echo "═══ fibonacci.lsp ═══" - @echo "--- Python ---" && python3 uncommonlisp.py --fast examples/fibonacci.lsp - @echo "--- C ---" && ./c/uncommonlisp examples/fibonacci.lsp + @echo "--- Python ---" && python3 lumbda.py --fast examples/fibonacci.lsp + @echo "--- C ---" && ./c/lumbda examples/fibonacci.lsp @echo @echo "═══ mergesort.lsp ═══" - @echo "--- Python ---" && python3 uncommonlisp.py --fast examples/mergesort.lsp - @echo "--- C ---" && ./c/uncommonlisp examples/mergesort.lsp + @echo "--- Python ---" && python3 lumbda.py --fast examples/mergesort.lsp + @echo "--- C ---" && ./c/lumbda examples/mergesort.lsp @echo @echo "═══ objects.lsp ═══" - @echo "--- Python ---" && python3 uncommonlisp.py examples/objects.lsp - @echo "--- C ---" && ./c/uncommonlisp examples/objects.lsp + @echo "--- Python ---" && python3 lumbda.py examples/objects.lsp + @echo "--- C ---" && ./c/lumbda examples/objects.lsp # ─── Friction benchmark ────────────────────────────────────────── @@ -176,8 +176,8 @@ docs/%.png: docs/%.dot # ─── Whitepaper ─────────────────────────────────────────────────── VENV := whitepaper/.venv -RST := whitepaper/uncommonlisp-whitepaper.rst -PDF := whitepaper/uncommonlisp-whitepaper.pdf +RST := whitepaper/lumbda-whitepaper.rst +PDF := whitepaper/lumbda-whitepaper.pdf STYLE := whitepaper/whitepaper.style $(VENV)/bin/rst2pdf: @@ -191,9 +191,9 @@ $(PDF): $(RST) $(STYLE) $(VENV)/bin/rst2pdf cd whitepaper && ../$(qCSxDeUCS+w7$4N3FBOwzr6BY|D&7h2F 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 literal 0 HcmV?d00001 diff --git a/asm/lumbda-gc b/asm/lumbda-gc new file mode 100755 index 0000000000000000000000000000000000000000..cfaf410422cdc36d5547b589e62e6c80de5b7568 GIT binary patch literal 59944 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 ?a3Hk0A4RhD+Kz3$~kR$CQfrII5UYjX!9O z9&CtXYc5|zcxp)`8`HodJB)&~f9VR;>B7;THlb}wtOBmosXTP7RF0rSt5mxG5{ooN zN4i}{qOBY*2o1V}dVjQlZmqQ_KI!Rk?5nQ>W4rTWk$2nb`uEOO zS4R^oH&ZnEKWL3-w8p?bG;Y=!AM0HSbqy3#Z!WUvT#{ZI%dbl7{x*IGQ&~zU_3+wf zQX_{jUQqT*nkAl$#X3*NYKxCWmsn1tX2Yg6V@hJWme#F~*Ii^E*<*K%`gATXwtdUY zt#m5b)P}j}nXQSFx<}G}>12EIZX5)uhuKFCU%Pn{0ymzBZBU2nZz|fRnf8P|v{%9= zK3X~7MG*D}TgvB?t>M$SLF^9hr=)OVa0ivW07F_&WMCM$Pw7w$=Et;zq5c;wCAc@- zOA_x2!y`Q5rP$R_r&p&p_l8?Aci7WM{TOB#ckpS_oj&RZ%G0Gi-&G#97Ed2_v+}$| zv&ZyNA?2BjR)Qy}JO$cwjq$Im?d7g&nU@8?O)T1}_p${W^ zM#JtNn{T}p9!R^;Q}kBYqtOZR8&m8HukdcU!h7%^STQ`Iy=rO*WA;KKQSVgRMC%Y$ z71Udh+eQpLbOKc8u)q*}y8@`Bw+^lbMn882+_3}>R?}K-7R30pMcpO@a#Y;mvAF1C zA4WzZ{*rDOnbbA}*+9!^6Q$QnUK0tNPu?)EKB)Rej^4s#B@& zDmFy7+HN(%yWc#x6GD7xqESSX^b6G3p@V92wWD>5E`bSG4-iin6=FKb)N-7Rsl~3O zd=^zMDTl#EUH^{Abd(WBg(cm8vO~{Nv)oF(BGh#-AG*=(Q>n!0Vg-7IF6io{ZcS|w zs8+`c9MrIrR)_zzQu*_2yZxkwch zX3*y&B?@*zt^50=))h&ZOqRS&-bl|R5<1b(%PCFd8 z#^nE=>QS(OU5%p9MkRK(pO!1lswTs6lxGUA-?u2YR^(p7 zIX|yA$KJ@H4|{vnIUKoBXV!9b52N~WxH%15Bb9O>AdfB2ODS=QQO&Dw1joUS|6us32SDx zmeSn8+q5(k2LUZ%Z9SwVYBzN%4R26raJ2+EI!`;DJEsbyo$MsjC zr?`W8S~}GoT(70mu;OcJq&xV!mPWaQUufxccW?xDBdCot+`-veN_Pj_v~(tFLrXZ6 z7hzWhy)o|KwOShM4*pC_XSsu$v~;#RIFD|ywD*j22P?IN1OBsG!r|&t?EVmXjyu?; zrE}fE^dX9!hx*eJj{SFOX`(y$nU>CX2hVXUy-DuiEG zHUmuS&2$GVbZCw{c&nCj-NEnblxMkvk85c*?8G`W&mH_yvwU|jQ>Qn_9o(wfT(k$- z&)Q+J3w8`wQUQ)<7_(rPx`X3k*Ml_A9Sm#9gSc8MM9Nw!Lg=YVuNeJcoRUi1!Jm&; zQmH%msg}yz!L)M}D|ZKP)>4H#I9aDM-yJ;bG!?qQ9UP;jh3??KvlUx}I?${VqfASS z-N84tw8R~JX{6G-%pDw#DHdhE+#Sr-(iQIDPAz$Hy{D_trS4$=GnC|W2fwFT6;jbs zwLADr9a`fK4oz2je)M)N)uNZ2sn{}iaJiQ1+`&7vRPPR2qgCjY?%*X_TJ8=OYN-Lc z}#pf9sH3FZE^?S9i!qlqy9*W-;Pb*uGS3P*V{`InA%HY$I#i6XeV@b z|I-e=5ZQ(lwU0z5P$EbELFrs;(!oK3W_1;3L?3b7zu(rqpJEin zVz5<9EKiQesdne*u*@HI9hsd0IxI!kB8SScBdxvhe-O!iODQcY|KD?S-#p@f7_s9m zy?gKb`ldRrc2XoU(pO_nRX2*mDMvRmhs;eqI*0}Y7NDiyls$Cxoh^58>VMGd!4h#2 z>8Ml(2yN9_CiBJM^q@MS+F;S4&($`Zc3ZTJDr3#s6gz{AHnf+au4YaFy6cXJJV13F z9{kDF1Phx&S2x_)4kS4+0Na&F`v+3r{sXHEGFqPShyJ-QyC$ZJ-WuHlC_XFq}ZzR?graT7z5s; z(UN|kucp;w8P6vKAJIpOzWd2B#sPNORIzs!9Ol zSFZn6a*@V9&eWZ}txgK+TXZM@bf!_M(|1gbpu{3^kj5OMNu#cQVrvg-# zJ9w@*ABdtEQ%*4PztO`!_cd(nkJ(W$w&{$AiQ;o?qW?gu?VsbEaql-p`fqx0SLC<* zk6mRLa~o%WQx?&odCN$lrcW~JZe-N3l@vGub(e@c%zCnk9#b&ub^D@ce`Qy(!*w{X z98kyBi|zKWU4co_)96%vI9L7CLnrg_q}-CyGCCGX7Ga} z-=HZ*xtcGRFTjn&Ei~TgX%=#57R}*-2*c4-bIk+W4u-q=(}F(39uc4FgsbfNxJ=EbqhQ?X3G zVCv|}w_*h-qXKBl#0jLL%JCDWAj|O^Z^ZsD%7JHy_QtlNx=KQW#;O)8h?Qt69vjfN zNhj&zz(hVaEixvqY!74gfC2O=G@LBU9~b=>)q(n-5|^RLZ_}G(qAj`(=0aF8}SUfXix(oW}E_hUu#~f9C zC4X@=i8L}~vSkD24$kcb3{$dfPU4tLY*QS*2g^e!+8l9PhBt>Sh*#U_g+T)MR>X* z(eA>N3zn6)kqnb`mlfv<*r#w;hWZ}tVkcv)+wK2E&ePTQFA>im&Q7KC&@z`@PHU zP$XIu$E6%KpJ6vj&t!$&_Vgj{4Ihx%w&NN+=CP8J#<3LO#*}Hv?hU&ssJF}R-AWJg z?RTWA=hKdCYa%MYy=&&y6jbroc;tjO6$4=1Rr^)!EsnbH^TNiHq0@GNo_0yLdtca^ zg6B35+Y>%tsOAW&n(JQDRYUeKnlZ29-4P!O5VnPs!W@yOxU;X>HDg=-Empy zf+*GG-Pg{{z(cBf&#Y3wQ@7g#Bk}l3&b1#-%DMLI{&-Gx`6fJ>a7YJtzeQUqvq9?j z8h4&!4hEH_`{C88k(XcXyQ85`;i1@qt`w@A+>LW#y6?hP9A;kbL!ye&G2IX6q-Ocn zre+3s9Uk_4fm$AeSbyFbRhBC_%y-%!6YndmNe!*<&3{)1Y52zARN zhxHz#`vaOBM#s{8myStvbr{HL>T#pZY6%a|O6`6Ry|g3iIT#?V$g8_mH+6A0{X+FM zGVWsZ?@~7f!kB9>q0w%KOKJ4CZ%ZlYdMbKua9pz9=*@w*$-rK^fG{Ed$-4#Fc~}SaNY}j9L$fQ?TC+VTk!&&XQTHH z9KmWVV8V|)^Ge@M743K_?hRLxy_=_L+Vn1l|6l>W`brWbdhIr3tk!O7%Mo__N2$0c zghy;^kr{S2Ufkf`PIGNv8!39+^&6UZL9BVd+{w+0?U|lOLLV#J{Wmr5(RHt@f}Y5a z>zUlxeJncmgl!8;OVA_LBC$%BAyM55K%?XF%8s>ev^>`4&2;td8&fu77B!Rf`)axE zYc^4hN|Qd#_2x$i2TJ=&V{5WiiI(k$K28tjbZyOrh{5;^Ok22X!Vf@EOYK)G#!5oA zj*cnw$k^Jo8Kzz+d%|ZuKaQ5`QC)C6xVf_719$KyiWbhtWtekSQlN!SSAhm3@DW*8 zyVOq`Pztq9iN>FUAqj_iGB zQDLFeNtI1&cH5|ES7^gj@DwE$y`=8(lEhzFyzJ^gkpW9t|U5%s?$b%LF2n2okW~r z(QbK+VeGV9_T7>ZdWIJ1QpJ7aa9@3*?INQnJphhn2G5&)lQkV_nZfO9J3Y>{dV)5s z(hR3B##sZ7zUN3}L|h_+5SMIX-&}@cT<{CpHvFG2I0xO-Q65gvVaw&&BG$M5H%c}| zmJF9DCkpq*>s3n~YXG6AZ`ib&CUD2_qLfh6AxsO{VV|)>@33(WEeM@Awx9#Ye^_u3 ziS*127`-M{3B0Oss~MeW7sM~Sj<=dx2hnLVo#>9=@sy}GaZ#W`m#woI<} zGxZoixEPE!99`_e1)3DWQNuHcJrf#{#^DSwa?fUWIJ>9ArDFunB=iJQ z-1Wq**EmFd7HNxZ5#xi@+06Yg6*@sZb@GC$;wQH0D#mjs;uMpAV`|>U0Wi(dkHh3C zCbq4%a36sT$k^ZYY$1%}16=%a29KMBhuR%i(R84GYk(!^6dG@x`|v}9ZFp>b2sw0a z+tIxrCsSAnlrfN=p`03L>Z79v9gnBt(U${}DY#umrWj=g*rP)hrFLU4ybY!W>Tk4j z)neBO44=rJE_IE`I1ghI!7P$PeGYAsqy9CL-C>Ww%$%c8f;LKZVxPLB4c5cH_Nj5> z9s9yE9PrJ)P|f6101js1%h73ggXJ8lw1qBJt!$_q9IB(!bTht&qdRva{s2j(gUwMG;OLuJ^1E{7=$MY-yMdooTTq`%h z0HTC3aE_zb2lJmih5|4VWY^Sbc41^EW^JHa_>A3Z!eu}EPf7>9o zUlfL(?S2A3cExu56*811Q^^+PVmxI$DC=-U$;a9XKbbAF;w| zR5mF(m0^B95NT8Mg`B=#!XTop0#9KyzsFBu!?vg?3{$^_G5CLa3cKYk)i=?am<)Qp zb_ZJk4z9shADzFiar6Ofv$}J8wv50ddv-XJ=8J#n`C>5LH2kQ59$38+%S}NjX)MoD z|9NwC?Ad9J$13nz$Tm*3McQTAKOiS8^2on z6{1;zR!9ew1oMLHX-X>lTJ)clHUh|N;kT>3gP)*)Uf1umb2B+zu4)R#2XnXDiOhuD zO+Q({lUXQ{>js2(Q_&*lA{+}%gbo4SCn6z_NKSc2S003Znh@xvq;z#0~Xi z+eH_vHpd}XI;e9cWK)Cdbd{>>%d1VfTowp@9E(~w`weJBPTWcrg`JwdM>0rx>4&6` zQ0S*m>rnhW>SHBR$nPlRwOGiWXvnuHq%#)sw`fQuh1?el`9(D35(?>vh1>{H)q?!3 zdO_$bRQKy^^tI5>)i2(R(uK1#@Wfc;EhP`Wb0Ic)9aC;Q84j!_@jqAp1h?S({JDA? z#euTp=ju;G+xc_#2ZZyj z{T+{@bh)07g}qB*=TVs6W5{2~$N%z9A<*IBJZ2& z6iU=qV2F9lqetX5N&Enbv z`vDmW7VzlJtF^WoWpXS$dUnmGUox+!<0A=VY~pkFBacPT z*(y*K(44l>T4*W!SCpi&D$Upd`xuQCc}i_{d#ts%$?7b}F)b6wp?_>7#$96ci3WO3 zV3a;~qN(x23mgaOhp!`G7(zDQ?l-W_qF;k`WZ#6Y9~nTCRLHfS9@p*2zJ|~dOlCl> z8Z{AmTcbLSstN7V=yHwb6Z)G*Wf~O_`i(|&HOeCN1C6pY${@5sqsbbbL8wKevo%U1 z3KttP#sv6&n^Z}z?SG6?-{Qc@{ zlWY97^^N|dR)65kKhXq{DGwErpB5?Ut>+brj{gsL#sdG+=PsTa}u%> zvJz%cU~6KvuO+d%rp49R*3dB1)$FTpnVHzw6iBJ5Z*6Yytx0M0uWF$58|qsF$qoL- zWr4bWS=s$&WV^2Rw=~U6UeQ$3*3gvFh?4nRW+wTsS~)Y>e^r~WVP^jp{|aAyV~xKh z(O1=)xB^95;aij2ZQf0sk_8%V2ghW)MzOVZMguI$xDPP+vV$ zDAo|Lfp^=L+ zp6Mbqvwv$_l`e9Ue|2*paanauDwlHRz~-iwfUhB=)wj|=nB^9KE6SJD(B!L0YeIEr zG_?hq+X5M=X#arfhNf1325GwJYvuq|qbh6=DVRzc5U6g>pzQsPO7vA%`O77 z`51q`wuZn7ak$2hvFATC9{E?}(p#Nr*I(_A&uh7VP3zFOR8ZMaA7RYS9(ff@p0Yrq$19k8lCP?zCD z?fM3)Z;gkrjHnp>{xMmxLeF3ilAV#?($ds2Ej<=U{drpYiu%@8jQ4b0?f}pH!dZE_ zvnJ;*%~4b6Y|V)k3%ggddkwqSvm0XfCU$RQ z_fB^2X7^rpf5+}4>^{!!lk9F`_gQxT&hG2%zRT_*cE4aZ$*1chncacx4rO-)yXowX zW%pcmr?5MN-8^>Zv0KXSLU#S^HnY2)-5c1wgWX@U`yjiW?CxfFFT3xu`!Ty;vpc9t zU)M?Orn8&D?lg9D*qy^}3A^*ztz@@~-9~oTvU?r7x3T+UcJE>L0d^l}cPqQQ*nNZD z1MGgp?&s{LROeXqIf>n|>`q~K8oLGTRbzw${yu1VJ6UYR-FYqG#8JpO~< zZsT*b{u#`rKACh$zn^krUt~xno)|+)qMP5uVb*bc<|yCcUV1(({!^?xhkNPCtN71i zh1rGP-#OadgW^Rds z;${s#M_*SubD?fcIEMaY=E|WY`7`Yp>C9p-`&$unbtAwe0(UWUR~#d;mU*(^S20f! z{A%U`Th}vJPF&!3nag^(o4G9i1I%SPA7-w{aV&!;nUgg-{}F24gyKJM zGpB!>9sl_-%HyeJeac)paY0`(m)A@Gk*}}$p+9rkUT)^H9)>ZO?KO(IY%km;Qu)gH z=UnD;{<(;`oWHY~%Xuk}In2|JPcd`ZUW=LI|Asg|Rm|}pLmZz5=FV2JtQO`&9om+) zn)wNWU&kE(55(~aGpDDM<3D#Wm;LG|%=Nkvi}5Sw^j~}8KYwOEA|671f;pa*a(uQh zKh;4kYX@`u-wwy;Mdl+N)Uw`WF8lvM=J`W z+z))j{1T!6Z{|}4@2@7j!@Ze;pU8Zg;G>x1cLk2mIOcL6GMRa{L))@4na>bBkNHf& zOPS{geg*Sf!Iv?gC3rLQ*@9oqJWud%GtU=1#9Z$mV}Z9bpBqC;x`(+f_=C&~1b>|Q zrGjr|K2Pu$nR^6(oq3_)2bmWM{uy(<|BVGEss-?HZ%GU(DUErl;HNV$6MO>ma=|ZR zULkl6^Z9~%m@g1~5%YzD)4wjGb$^lIjm#?rU&&nW_hW(IX1*kbl+?leGQn?We!1X3 zWqyU=_cQkj{t)w}g8z-VPw;1$R|)BOF|QH)edd0_dzjY>o~SlNhkKU^K9G5x z;KP{L3w{RkD+ND?`EtRhFmDiiHuDvN7c*}Z{Bq_^f;TX47JNPPs|3G6aV*+Pa~vVJ zvA)~~{+RVsh5oOY_ZR$6%m)bmIP)~YJDHy-_%qB;75ru9X9&KR`PqUWWPYCDhnPV8(1;DebPd#I`Glb9R(sNttEH}+D)M>99}Q^UtIH}+J+Co(to zRl_f0ZtSgwXE8VSSHovBH}+V=FJ*4*vxb*5H}+b?FJo@(w}#WdPPA}XHuhY@8<`vX zuHkE#8+)(e*D*KtU&F)9jXl`#?=Uy^VZ*=A{3g+kKVxp}$3~z2%_EiH*pm(aGjn5K zHvF&5jlJ1$^_m`}W9-j{|DE-XJ=*Zsm>c`F;rp2zd$r*QnQsx-^)d5j1^+j5W8XIE zq^gObpJnXbh7V&(sl1EU{dZtf=-{x9a{{(|8N%8<~{ zGWQz{AHv++e=vL`b8|n!@bS#e{RzV_U~cYL7@o!4+`lk<4)d?Y^_DOnRFz{?mAih`G7nX83UC=Kh=EqnMlfafYAG+}xit{Cwu- zex2c&%+38f!)G%$_wx)dVQ%j48NP(Mx!-4a9dmR4&+wJZ&HX^b+nL{9lVgx_Z&Cbk z?_dYDte>*}&xQW|tgoE7IFGRY?}Yvq)*ln6OX7>Hzf zoWwj$@afD)2u}Zko%(sY;ES1$7rdVNB*9lPpDK7e^Blo%Wo`?87xNOq?_<75@P`yn zw3Z6~wWXk$5w6b-auVyOX(`=YPRmZ3pA@|Hxd{+Y`*w<8(>f!Q9Gm z2E49#qP2Isv%L;5j|l!R!*@9K6Wo+8eunsrlczC1B={)iJ%XPb<+B|H&17yp>*O}` zRKXW8PZPYF`3S*Vn5PTAp80se!^|fMekb#(g8!a*j^LflZNc|2FA@Ah=8FXHmqyi< zV69x3D!Mwr7W%tbf0oGib>^9ZA7Flw;62P2pXAIpX{dz{{?FPlCqIe#Eh3#Wm_H!+`ONc0 z`Z>&>5c>0&e=7JA=1&PuzbT}0zAyM{=DmWqGaoI=L$4^IbT)|Vy_@;f!*fU>`uR2U zN|DZk%wG_E3-jj%f0p^r1%H+KyMn*Xe4r@j`^=LC|BU$*!L1YMQWC77-~*V;dN`5! z8c`3Un7<>^8OOX=@QawAC(_AbUMBdZ%r6jp5%WsH{mg$Qcr)`fF}|*5zFFws!2D^! zzr%c>Nat?m9}E58Fdr)P|Hgc@;5(RqOYj$&w+l|M;GuTBNAUNUZx{Rs^OpqgccM<` zh~R^negE#_{~Pc|}77yNeS*@EB8e6-k?{+{_L!5?G3R;06? z`Imz4X8wTSZ!_O5_-D+Ai+mG@>vp_e@PW+l5d383r=8*K|7S4YEckflGX%egd6D2b z%&!o99`g<9&U_azuM_8jD(0_<@?XjPUBO$K9}#>V^De=!XPzR;c`Nfz1^)^2YEk~* zG0ztKG3GxL{CVb^1>ej3ZNWca?h^I$1@k$Ar=G0)!})>_WBxtCM=}4s;NzJ;Blsld zJ%UeT-aXpczO$KsBKSPR$2s-OnO{7{$uDP~FL({}y9IAzzGAF1oo_LJS@7$be<}E_ z%r832na&TG_nz(KcQaosuIqm0zY+Wo%q>y=P0U?_Kf`>O;IA+rFZh1uBLx41`T2tX zoB6eZ_a9;5lVII0_%P;Q34RvyJ%UeV{+8f2^Xa1g%b70}{Bq{^3VtQ?`vq@f{;1&B zF@IL@o0vZ#_>YGHQOxHoboS?SnEzJjPi6iu!Sk5QaZ$#+Nc8`u%;yN+cnrRl`FDl>jm(z{{(a^* z3;qk{KNb8>%-?qJmS+<4zX*N_b8Dhge+KhQ1Yfce?y zJM+DaxmWNS<{JcG&ito>w=jQ9@NY4HQ}7`38}nEycVOy++Vd=B$31utjbImKC?#mxULcop+; z7d!QrGcOgqjrjq=uVwzV;5RV;)+NsLzr#Fns+0ea`Hh1AlKBUMKfwI-OlLZOVZKiA zPUiar-@*KhY0h+BVV*1aKIV4_{vq=-r#sW>VZKW6q>&ar3D(J3PW?3IHwr$A`L6{( zhxx05Ph~zd+nIhI^Rs3;c@gt+!51;VL+~o*e-`{o=2y&crXOIwUGQs|9~9}_#Qgjm zXF7K>&l1=5bLNeL|AzV9BAq`o-z@b1%6z~KXTDFFbcFs+=Hqjn`fo8`JIl!rG55`O z@*d{r<~#YIQ5HT}X9Yi%`5S_dVLoz>Go8uI9~OKz^AF0M`lZbGRXDkq`HcBa-pIUq zfsBv=s$1tZD;x~Grvyo_n3dXz^VUllfK}C zPq*+%u=-u<)IWpyj|890e8fDb{ygRp!Iv^$CwLq4ZGvxP{&SBr{U0$OQRw7 zUCi@~ocep1-zxY4=1&X$8S~6yXF3DVu<%K+t`>YG^B)R6iFtB~Go2aCFDrHOLgr@* z?qzi@Tb?_s_}@VA*~i+$P$%*zG;jQO*IC#36qza#c(gP0!@d^qzS!OvuF ziTzjx^V0>N&b&qNIn2K&cq#LT1;32>9>JF}A1(G*E1Ay|yq$T4;I}gWv*33#uNV9` z%zr8PW6a+a`?2lJ+XeqS^X-Da#r$`If5`lC!9Qnyw%G3_ooV5dU^NTwW`2+0r!nsl zd>r%l1iz5^6tO?dW*!uLF7tZ@FJ-<@@FmQrW#-U@L_f96uM)h4dA;E4ncpdRnE6YB z-^u(r!S7@K6S4pNGxNs<-^Bba!Czp0lGvC2gZbA&Kf=6H=zqfew}K~(rm9M?b_qU+ z`KN-P#(ZE_PPC3mIGedG_+;kwf@d*bFZf*MR|#Iq{42pPW4<=qS)O|49|_*Z{NI9K z$9%>NXF4}AFBSaz%$Es%5A$_`|DO3>f9n3cf{vz`` z1>eU!MVvd{WBz5Hvz(tZe@*bjv2-;F))B#nG7k%WD)XNUKA!oBqC8p0;B%Od6Z$30 zZxVbl^Id}1Fi)G~yxu0}zZQHA^BcuErJebD!N1GAQ}DZ(`^5R>KIV@L{vh*Rf3B{;GY@Z&l%u4i~I@J8=^dE%>O0$2-w7cGlCBoM>Tc0 z_gZq|K4&PNU_CDM&tcvp_;lun1kdO6)8f)5aUtt}U7F(vX<|N1@HNb5lsWZ-%r6)G zd(4*${!`|^5d8PdTLpiD`HuvDmiYsMzruW%;O{bjNASbUt#apeeaZY1!BfUlbtPEy z1s}@%4}y90Emzn*!%(7&DeLc#B6{+8f>V*WG1A7wsmp|d=jnHLHE4D+i5|2y-Ai=64a!Mt7Y zZtyg;yOrkDKcM*0zyJDJ@qS1BF05-Pr2~EOyAO;1q3p8iiA~nr+1{euf(7|jd1bk` zEI&6-2@A^#Dl{rC$uCl9wx_sUBTspL{yfDB3v)}fFu%x%<;An-0CSonA{=9lFwdDi>_l&DCDm*meb$n|KsqO723t`ZA#%TZ@K%v)68 ziOR?v)ye^La#6Wa--6~N<;&UniVjx_PT&` ziamL%Zs!!EXU$eukC^Cmq@7RKNm6b(Iw%QxltDn>^+f9np0fNo6b>ntG4=0Kl_6@Z zq8MIQsVD{@dA6NfR#8kH79Kbi#Y9X9YShMPWj#bu@&b&{Vx3ymRG3Z0FN2x5a;Dr8j4Jfm}{EJE|29}&bgMG z`2m4;u8vY3OS3#Wq_I@YF7|k6M#sg#S6+el@shl-pu+a%mgN`al1~Y-K=$V2f{XLi z1Nv*YBC6iEJOW*n*rjvx1EL8a# zmyxJn{6dm?_lrXQ06Fvq7;^Cv7;>6g=$l>zV^uYJ@uCQF@IDZ7R1@-Dd5dB%1bYwQG$Lm3`(3m|FO|^}vSLZSMMlBaXjZMd#H~Cd)V1QZEm|d-R;y{!W!3zm7*bePtzH#F zBE2m}y&8r*N{9w2AH6KbYW30!Vbn`^;$<&&Cmlvt8d_K3%HakAYb?xYDmq;Z_d7_{c*9A+qT%YT@}bqRL!mu@?VVMC zl|AZH8w`p`)rVxNm-_>)7PcF6%JOm6!2X3!M{v!d2qN}AboL=h?aWD1TSlcwnN;M? z!X^!vJhbzHm|wJ@h;|7Ov5PDyGM*BgVJJE5II^Gsvz@(0Mz17#&`&+%O%j@y}H=~G=R^`_XThp|vk)!)+e9crcubO`9 z8|$(0YW7#x`x?AhjaN`-0^&E*v|26x<_1-Z6P481L<1PRHLJC{&cDL1W^b*82{%fc z@d`WcO}JFd8x!k%NE1sbS24|<-dIpgQ=?z$U}bEnZD?8*SHp@gYXPG~NbpiAu*lWa z`@J;zOk7s$^P=V&wd6F_@YsdL1#*dW9)aa1s5P+MnMX|v zMMRFRtNeZ{)rvMR_gIW8`83(&eMT3CpjIHWdA zX&4!Z49_ZG0~H$*RgohCHV770DpUq9v=kHjHHGw=N((pbkt`*sQY*=nT6wrrTWEH3 zY#Lzx zm|xe1@~ghW^`HPw3mjDk>An-ETa5vw)7A<)ZzfI6Xke|})Lf6=YRZIH*BEK=AueEpV%wR;<7) z2qCwqSmdhR5(&J>lcNht7ahz!xG6?r#*ayYFdbeP@_6Rc;-P0 zxSlvYc+?={0L=2bJmA%;nK(cvrdmc#ka%w*Cgh1Y^Qb+P64YK^GhIR0*l2IOK-bR& zpx6jfgfn1*IT7V(R^x_TUI!FIeC6s10D)#Ck)jz$Dw1irW;z+ste_@;O7!B3R1&oP zBTa6r=4e|r>kS}<=@TAFl%Z)Q_VFc~Ky{t)P)AW47%WLN^eHwm8ig@}LeV0ni$ET3 zSXEqoGEy-qi0a##*j$ftq1xe^4g!&mQWNQbqNhp!O4u73Y6zh<0uu!( z@Ge&AvXO#hwo;I&%@hi%sbwWP22INdB1;9isM*+Th2uQ7Art)#Rk$8(C$zY%p{dHq zJQt9L#(d!fcvhqGY1;>-Pa9j>qLa)!+uF89^wgLi>n@I^7nf5_8~A8p^mg7< zrSd5QQ&h9cWKVm2o->dN`J#!CCwe{P;Rz0UI2FVq!4r)GSw&I3RL{5QlCjZBp6D?4 zH|ROVSFI|?nh1d|CoYDvT=@cIpQ+cjv3hMAtJk)%dSx4{SGF;%#W>hQ#z7mh`o^W> z&|I(WWN^q%h6AUzlVOl)I~fSs$!M^tS1c@nMz@+jkol42P{N7=?yC9#P`sjzJfjf5Qm+s5i?4mY+j9b#-_+J}l(g~!y% znL(nh5v~i8vWO|kXwmARu9JPb&Te8I!tRD7_ua*m0pveNl{gjYHf-tkusJ5 zvtxlGY+|aHlDSO#jJ-_zFbwE@&L&V>%yf`8nboV4hdLnA>zqkZ9mHv`f=)nweyOvU zjAmZ!34qi#f!^yJR}^hPLyM|@>@23*0@M1)r+&&M>hr2Ajq`Ie#u08}C!v*sUiYlZ z97|2V@mWA)k#pp$&1nv#ZFCNVWf$*$7U`i8*mOq&8T)@#wD^Lnoj^1e`IJ46lO{jf zM!gK$q2wqNX(1;w4Uth#8}lfNKDD!1FX}}Mb-12b<>Sd2g5G*n!5T&zTDW@JhQJ|a zzgA^7mDt_$o{1zq|D#JZHQ?}WdM?(YmL}Z#2-K+kNmUJX1|(lYU0!vbiB%0ItA=P+ zO?<|y!P!zzj@HB)|5cnFNxa;UsAod00NJF5DKuU*SK(V7r4SXx{L`>T8UA3kz>&t+ z+!DViVH0f5mMTQA1Zv&Us%pulAhodR)w7D$DN5bj(prxTCa>O0E3u)z5vNHdVs)vl zZ=qek_NpUr74AvI%BfR=0!_mPE19oK$#nK1ooIbRGU2cpsl#?vEp4{Rm{En-{~Aal zSE$0gc?Attd4VtGT1qk4Z<)e5Ti%vIGsZyVM*>VsO}b7aEuZos8;Y zwRD+!Ng;#i#OhizhmpiJhPg;5RE0&68Ahh*)vKbxh{B4H;!9SC6Sp2pEwN<1t=u=! z5=vG{!!(Rr@_5_^H^U(p&6-aS9F>!-MOcXOtPQ-lGml3{yt67R@>Os}F`h4AuUa+K z0s{jhjzQEn;Hr64yWBz9qq2r^i%l+Sa;ghdz&Jp~BG5pHM!;y%7EGlTjX=g+GX1NBeDM)5A4Mbhu-3u;il+&p%~XfR zrf`aaAyd~Ht2Ywk>W#dydQ-PBXn@yYV)Hf7-Uq`EzJ|Dxz!NJvJkgRs=Ay4c>?&;R zFoY2uK4m*!WAUR2^9oA56*ivXu<-zoR!~-Sww>z+!|BVX!&F=7s3m2^v+}+4NKhp! z>y*{0j_hGDj!*Qp`PJzK(#oijIV$pa(SBu9j*5;TzN}cFzBW#WY|2qFE}piJQ%I|? z7X5@IeY-)+>RSAb)wn6Cx4Y6Iv5n!}v#Yrzeqi2>xK zcOa0I%?2(h#VJJNIMQOZ#wL{#-Rhc%0m8a1%Dj!yqx}tLKLSAyje0UPkl`DGB3^G* zEAEX1aImqwehfLE1&a@EG5f0E25>+ix6VibwLws7nD$$({{x@XkOrROw31C)=6TLE z4Q{YafObhY{&OZg#1ai$nxmzq?DW^J`A#(gyYyHwF%#dsH(+T!D^!~h?U(T>Z}F26 zrD)>sov-7$;M|I&OnmeE6DpoF2d$s;q;@|auU+#kuOE-E_8C7jqGOzABC;#v|1UGz BM6dt= literal 0 HcmV?d00001 diff --git a/asm/uncommonlisp-gc.o b/asm/lumbda-gc.o similarity index 79% rename from asm/uncommonlisp-gc.o rename to asm/lumbda-gc.o index a16cb149f534d47874dc6b1798b7cdc172cc2c55..e07506e902dc7d960c1991e7c56920355588f0e3 100644 GIT binary patch delta 4593 zcmZA4e{56N6$fzNIDkFS@GGd7yS1IuMQsqR9RGn>BSdjaXCjg|u1aazNyG^WKib4L z8qwqGHUgfdRTOE7+X=x&yEuzzQVff=#!kq9m~>J>)wJW} zq{zooj-B&4_xSy|@4f4pN&Doay{Af5C00MElp|TE4)_^!3)_;{SG=6N#XBvjq-%xFvOb15>3X4RNiku!`H&`kQs{Elr=VK2ipwP|aE&@QCgbni}@N&@T(tjncX%FYnL|TLLXwy!?#P<-V$2F`ahB1#Q9}qrKh8g^D7aj z?{W*>!TKoDyR=m!v=iA~8m`?A^HU*j@VEwecWbj%=v%Cf2$D7n{WEI^Vx$Lze$E<2 zinLc~j`eL6NZ%9sEo(n2_R!@b^xnC9soi!C0n)TkFY6UVNpnK|tT&M$y)AS*>k?#1 zSK3R@z%N)UVZBT@SE1dkHSm$v3jIB6BO;`&LQk>oL!9)m&`(&8B2C&a^b6J$)GKr} zgif<&;U%3FYFj!#e-|N0x}v;ve=XMg5hGnA^vA3lkRq)Ux{mcF6iC~IKEoP9MY}eg zLie!JO}bsH-(q*WN4<+aiYIY_;t+1P`_(9X9a=S^vBRVGqnlz6&UARp@wqGZ?w$me z&F|v}P$6wj2;I*52Y5;UB($CNF9?#J7rLMIABcrCei?E(U*k*~sgPE~7z=qY8ggM( z*bPV6}YUc9>})cX-@&B*GqAZe(fn{JrPyetJ-#(e8-Da?f2o zcjakRL^K*ms)f9a0LdYejY1A1N^+W{LC8@gB04!9X=+mCN#F1@NLWc38g_avxMi_huZ{hXNjfH$#szl23%JN06k6BqO8_ zu?(&H_#js5(v5fysf=H7P?-fDYGi?a{h#CHbLbzHs@X55x&ce@_X^ITkPxO%5jl@5|O-iKE*nNAock$ z?=rQVu`Qbau+V1<(s^y_SzSV(g__jnc~-a37vY`sn?0->h3-X+#&)tc2t9}tX%}mg z&~6ka>1W2I1Foqm)5leZL{%JtDQ(_o?GbtsQPPiCj|n}C1nB_lX`!DYOL~!YQ0NG( zYuaR3hlJ9)iFAf_T<9G{NXvQkG$V8|;@7lViZjFrX}@XZnkG>bMu9rK${H4W1Qq|$=1tZ^LXRUrnq=(}nnILxnDv;@ zaU@9dtfz(ELY8!4)j2418LaEH@+n>z^coWChL7}7)^VXVh+OxZ23FhL4-=cMxEaON zR-|ccBdbejGt>=jI#}I855P+rWvv$4i{K5d-p2kL9@Eb?4Wi~OQq$4tQl?gu?`76 z3?J!H)^VZzh>)gOXN0B^C(W|j__?}p9%qpzUBq`wm(UeZ1#RwUbql3yigW{Owa_{Q zNnc{!D6|bR(hzHd&`zWZT6LjN_(Bch!Yx0o46WI9>IKx!KCY_JJr^%f9EJ1i$JGpK Hzkc}tlP;tc delta 4680 zcmZA4acq?39S87xTAXi7#d{m)v!@}XC&HAmT@TH0DS_TbcBnP&ffE)=+LvM}YfJCl zL`j@Uk4cyYLeH;87ER=~MQPB;<#3TLX512CFfw~6wuRF5aI^*5(i1W8&)DyJzoxn0 zCH?jKe15;@ec$Kl^FHr8HdZ_}R^0uNs!BZkfKv04wd%K_vK`x-J3Bf$x3_QmO(gm6 zHK*rTzo@ORTl;jdHW`0vPjPZlc%9eG^Avt!-^u-5?3ss{qwRYO(ep0Sjz+Iznfrx& z#B~N)N1IBar&$-lw^^H|LNBr|Lzwi(LdRLF5hYzE^fv2Hk=U&5kWdT0W{s)Mmi?rV z`w=FoY_?3DkO%J0H57Zo2sUf8PG}YD2Dr`IZV3F`F-_1Yq&p6l9?rd}gLH?!`9 z+M-RD&>gJ15!j-!bBniRH@EDEL;0_X{MT6zAV&I*&>q(JkRp9w=-*hA$dY~{^fT5J ze9vn0snCn8rw}GRD>Tb`9#PUuLhrJ24aJ@bB%alee=BqWt49^W54gQlv@hfKGT1HJ z*g}8Csu3hzAan!kVz{JBgl=OEAl{4v>k!@Jco>xKN0d)$P; zR&CmZ9%FqT4(ZE6ds+7(M*6nUG1kLKkscFTRFWU@lgN_x3!Tq80$-~(6GE$4Zy`)N zr>JmNR_rcI5|H(2WsCT$e@E^8a2q%R8nnDtd8NaI5P z#d;JO(vw0ntbMTCwHXz9ll3-&q;uyKUT^8#{5Tu9qzi>su+o|(T`ly7tZR`bb%d^F zZHMa6W{1!Q)-D7{_X>T1^({CZesu^jib

eu->H$PA18|8agR!rT2SiYUbcNKpI$ zneEzqIK7@{ul$!~`KwOA?$jnJw1xGr2$G%<`fJu+xTJkTcd_;(PC6hItml#L^s7ry z5kGcDyr_v-I27@g46$E_6Vc{tQ9a3e1F?u!H_;RE+urF_G<#(aLb>`i*Rm@GtVF=o zs3OVVf@VuL!69iPsS!0VAV$(nQZJ+%DU#!^rJ9nb+|DLdn*7PxI;9$tuYA6~NWG5C zIc>J^`8V?K+(OL#lqT&j?=4bg@b%A5&1rs~nn^l?FzE+edR1r-qWxMO#vl4a>MzL9 z_kZAazhBM8!vi6T?tou?jyT10NK?E9b>6SOK!D<#a47y6F^bobqIeEjieJEY!LKF} zzR*bLmbgIM(FMznmgh%m=Dg-3L*gB@?6-t0g*~WIL-LW36$p|nGR>tK&*vw^izXaj;{A=A!UBQ%0I)$U}i7utn1>2B60p?jgOXtf{air*aI zoGy{`4xB66yvN!t^nJugldK1Yeu5NfiuH)lPmv`(#d=)mS@^DMbDp(V=p}?nCs>Dt zev2sS%#-kx&{8C>YFhZGuKJDUr#A2OJCbL*BsZH2U|-W_F>9sJB?yuRSgV9q!@cHL zPau9RWHxb5lgMd<8rSA|)`-xT5g^^i+9mXDIHZSJyM-P@jPxYyL81Lfk&dt)5jue^ z=`GgdLg&CYp-p*ic<9qBv;tw$#jL|ZA3<~?WNKMGcjx=a9VplI3^G)^k<}}-5%#1u zt*n(opF@yz7i<3Ab9Ns0z@60egz(Cw-}G=!{ylRx=P1(DLyEOY^nV8GI_>_f5uslp zKswIaCG;j7(mSl(LhnJ0w1S`F4hmg@6lpc<5ur86lGd>v7upEl6ul?0_6mIwVbWJw zhlR!wB|XYICG;c`qJ>T{c2*n1_svS73lSs@uvQ6O4VQE+YmHC` zang3ydZ9azChcNv61o>xvVH2GNPQhrtth#%Ts0whW0k5xbULOe4nuvjO5H;6oA3W0 Do-m>c diff --git a/asm/lumbda.o b/asm/lumbda.o new file mode 100644 index 0000000000000000000000000000000000000000..38fc272e475ac9c408dc884bcc40c7998677a6e2 GIT binary patch literal 53352 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 SzyC=SMm=_c>)MOWasCgkreXU4 literal 0 HcmV?d00001 diff --git a/asm/uncommonlisp.s b/asm/lumbda.s similarity index 99% rename from asm/uncommonlisp.s rename to asm/lumbda.s index 17f01f8..c9b9761 100644 --- a/asm/uncommonlisp.s +++ b/asm/lumbda.s @@ -1,4 +1,4 @@ -# uncommonlisp.s — A Scheme interpreter in pure x86_64 assembly +# lumbda.s — A Scheme interpreter in pure x86_64 assembly # No C. No libc. Just Linux syscalls and machine instructions. # # Value representation (tag in low 3 bits): @@ -207,7 +207,7 @@ .data # ============================================================ -prompt_str: .ascii "uncommonlisp> " +prompt_str: .ascii "lumbda> " .equ prompt_len, . - prompt_str newline_ch: .byte 10 @@ -351,7 +351,7 @@ s_hashset: .ascii "#" err_ht_miss: .ascii "Error: hash-table-ref: missing key\n" .equ err_ht_miss_len, . - err_ht_miss -portal_magic: .ascii "ULPORTAL" +portal_magic: .ascii "LUMBDAB1" .equ PORTAL_MAGIC_LEN, 8 .equ PORTAL_HDR_SIZE, 48 # magic(8) + heap_size(8) + heap_base(8) + r14(8) + r15(8) + reserved(8) diff --git a/asm/test.sh b/asm/test.sh index 9b5d9f1..73c55f4 100644 --- a/asm/test.sh +++ b/asm/test.sh @@ -10,7 +10,7 @@ cd "$(dirname "$0")" PASS=0 FAIL=0 -UL="${UNCOMMONLISP_BIN:-./uncommonlisp}" +UL="${LUMBDA_BIN:-./lumbda}" check() { local name="$1" input="$2" expected="$3" @@ -28,7 +28,7 @@ check() { } echo "═══════════════════════════════════════════════════════" -echo "asm/uncommonlisp test suite" +echo "asm/lumbda test suite" echo "═══════════════════════════════════════════════════════" # ─── UNIT TESTS: individual primitives ──────────────────── @@ -205,7 +205,7 @@ EOF check "load-proc" "(load \"$LOAD_TMP/b.lsp\") (square 9)" "81" echo "[unit] load — missing file returns #f" -check "load-missing" "(load \"/tmp/__nope_uncommonlisp_$$\")" "#f" +check "load-missing" "(load \"/tmp/__nope_lumbda_$$\")" "#f" echo "[unit] load — empty file is void" : > "$LOAD_TMP/empty.lsp" diff --git a/asm/uncommonlisp b/asm/uncommonlisp deleted file mode 100755 index 7bb9a8048f4644eeb6fa93e34aedf51b9a15487d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51208 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 D9UK6S diff --git a/asm/uncommonlisp-gc b/asm/uncommonlisp-gc deleted file mode 100755 index 5e1689afb508a09fd235afa1f8918d2e81536a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59960 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 Ry~dv((J{_25!sdT|33goQEvbM diff --git a/asm/uncommonlisp.o b/asm/uncommonlisp.o deleted file mode 100644 index 43904797e90b27bae7d6268963cd083f03005482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53256 zcmeI5d3+RA*7qwUfv|SK1ys~1sGtVH6(o`b5~)astn6awBpnh7NlZE{4mxO>N16=k zILqVAIOF*0EY7C0JnoJlNWfjk1(#6)}+Ki@F{@kxyHCa1>A36-Y0Nb-A&0K&N=~9r&MCJmpijivdBuxS6SF`!5)EiXZ~c zq!S06QVHp*_bBFWY;Pdly=ptlQ+BxvKF$9UJp zr_JXOMj}Sw6iAPMg~Y&*NUqy)@Yu*sH`W!5eHzaiN?rim4G^C@i0`cM6a$Fok7YlK5 zv3E6AnhA~6ZQ={$G{5%fUfR(7kg_t^bNL?#gsGx1=O%BN_eNZL+?1qMxQnbowKK#BQs|ubk(`zATD;j62eiVeXV&!D;`v zVze83*xkA}-A#EK5jcD(oqM)+zv-UTLscX8h`X7qQm`{^e=$6sR@|9U9Jp&_@wC0| zrxb54ODUf6O7XNet_aNBly=Ol^V5!QA6eA1t^2)TY$vj8z|#DSmuxFWE_6R!w0Yh5 zl=$oa+0#?7F{^mWmf~r9t{5?M)3DT;8-q?tQO}m{_e&)(x0CC$8%ui%k&)VM3-PD$ zVUZilNa!BE-;I@KKpAH*P^9KOck{PX_6DA67|VJ z>k6bVK|OS?JgbjpI%SKEVc@Q`6e}lUO7#?h_H64n*n)2i_QY=tHW5li{QHzdYBZB_ zvLd5$21iEZ42cZM86Fv!Gd(i6drbVRuX}pBcgH`$iS-8N3~4{m-L-_OMf?HW9WS$9 zOv{-Nh%QA%&6yZEJLi* zQ?^iP$FD;u5V~)TZ-5m45&0ZL>*zukO8FmO@fDFBZYS5Q_{DJYjq^#p4F7T>kw8ve zvABUQLZmt&A~krvWgOk|1N`G;W#mj=mzFc_%F)tU?noP-?RITL+?;(6;h#I@ zm3X~XJ{rnL=1lwcsQ7EBQEo?kvb*AyA#TdH?pNH;UU6fu$M64ABKDwFh;55c=zags z?B&G$xcN%C+4kEA`hC_zF-=7=osD9ejAA++#WW#jLS#JhJ1ghJ$XFEFnD`v1ZcH2N zq7Gg45c{Sr#8i;mNRp;6I}qsFsu= znBts^BN--y?ziHv;!;ji``{gEV}~Hj?!V)CI+Hg={zYiHeODNLH<9@)oBNn&p3p~o*he`T}Nriid=?#U5R{cKz@cf zxm8|mm?X6!UM&Gdj>0WRKy@UFV0ipF6q=;zRmtXU2*gGn!E-x7-9_-XeJ;V@O`hRe z8$~07qA{^OJ-!isxv||G!F42~-}TaqzS#8p7%C4skqhxZJyMGQ0|L>2$ZyRY)AexHy%9UX2m#GxB7pyzB+ua&Zg%?ibZ1OTP1OEp^ zT=#-Fy7wzE;8=qIgS^w7r`(f0Hw|6gS<3CZpRXtE1kA1x)wCetDB;b4pHYR7D#g@~_pk-OL4%4O(KH4{j=N!3B&)2y@JtykDnpZZJJ&sy z5&sbF1#w?Qy~IO@zKfDrL9J%PmbK$b53Re<{cN|pnMMyZpl!K3QpwD1M_=^Vj?~HB zW64Gu?M`{t?b=E;%>C@Z`iCdu;>N>Z`iObnu_f1?xSQ;w*lWpw!8X`dF%Kz-ed24x zf#_Zi?I4=wZX>0ejto@;4R^a?Xw3H+2~GVTBc%j3{E{TG1UttBJD0(tp-NBnYCvGa zb?7_X>71TG^byjvjxN80$6l4BplO^*f#jBI264kgR;C}aKx4I1S)MqvwHQnl@ps(o*L+|v_`?cuJW6TKHa zNjRsH;cTvOR#0t0XdBV+PzjJDM?^;8e|iL&^!mOvz^Lcxk$~sHz8V^*?O^ElTjgy^ zB#-Ys(z_RR?1T7N+`puIka&S$V6g;aAH@&;6M@Oho+8#3I^(u}h5VCl>Bc(G9v?r8{OQ=9;pNj9FQ2Az ztn1KEUlto^TKB(`T30+j8>p)-SW|vm<{|6<8S+ zYys}iU$g|*y~4f(3=_8eMGKK+x8olN-B?4W6+5Q|J41;72f^4bx1%RLGLzGnv!DzO zSLz?8#h5=)Vka*yj|bSh9Sawsv_)YJJP-{xqx&9oe~8__&tV~Pc^4&e)K{R1teei( zeq?N!sTB{f@wSNDGGdFie1A7G;PHLGH$$B<{B89*E8(?Qy^b~>wXsL+&r$5pVcpN} z3zOAmrws4}vY9hj56|tx!()wyCwd;f%pN|+)qLMb<7dJjHkF4w4osgcVO6}Dcwy3p_X7BNP{#nuZiq}W9aR7=d;Kj9+7R8$H=^7nNL ztqq}=iUg7DzlLj)(6++&X!D=M(lHe+wnzuWX6KB@}%1Ev{xHa z;2|2-!o{jOh)QWj_gy?1KDF=NgQS_TI|I@4X%t~|cBzpt?)}6_7z=g^ppgy_ME4u%h(L6B2H$&RAbPfu z#ss3D80n}$bQD&+;PcUeXwXQ<1fu_Dq_KhMZ;W(oAiC2?$HAmG((!@lNZ2K~H!BdG zWuz038%Dx}e5_fa8yASqHPZM%w8=;(1)|p)>EuB4D2xE`<&;456eD4B|6?Ozay16l zAFiGni2lGxrv;)P80mE6AJzzQ6;u98jWh{1jFHX=L=PHiav+)+V7)1U=mI018Hhe- zq_YCiEUdi2m$L)WKN;zqK=hcA%+5uQ8|ggUYow`xXw*pOBd-o)z3Ip+Bjp65Zy4zU z#K1_?0@0gCvEGb8^eZFf2BISlXOFKy;q*d1fGbg^^|44tfBjs0gKiHVf&ZK=f5CAwrrHh~{Ed4^l7?z1&E}f#@AZnv1JP z^VJf>bR0{iDD&|wl?9^HPGYG%5Uo6!r3%=OMyd=%-!fs$3q+qczRV9q|7N5Gf#^xb zzlA74!xkZx$FMJpQ6r4BBoMu7EVGNzj*PT45Zz~_OHkX@*7uEcJbgcS~_gDj4}RiJ(%jIZ0&x-jXf0~^{$vAedxrt^6kg+|D*d*m`I*{ z_7eH?=sxiW(}EQAntacgKJE$Jv9o(G-EpILhpbPj!6xbE40r42sY%47W7^gTO??t0 zOOi_eH?798}tsM!#|vK*w-OSn=8u{NsQacMx`;AXbP9! zek3_)F@~33)(vvAX$gib6RK*~rZ;IC6aNF{wOIy-iH9)_ts*fW92gk_<0Jkb?_*W> zI5Ge^Z$`VDSF5#=KsszebF;5W88cpa-p}lx;?}n>NNMjJpGs?gWM0DX^o&MK?cb%= za_QTB6|HFlc#sw4g|z=>&4kTN8T+H6&tUJq=x*r2%rJH^h$VWg5~K!Gy5b+d)mNzf zG^=Fq;`j7!+vODeT$YPVFgWT8w zSoeeATYCv=*1$*^{-?ChqA9rKIV|}P#deEtrJ95p^CeZ0tb_tt@}kj_(R~XlA%=af zj1)0U?Ttqq5}IA6JAGvP-r(lEjNs;?40pq`ktgyuIr-PyF1y<`TFw+mA$1^r`6raN+zLQitK8H#C%R}AtU#Y=e z@lW^mom^8ofsL~c6-1(GUN=^$nRy96PfT=6X^~OLyVS@LNGDC-5|a+}dflPKOrBRs z+|GK;KHla@=(%pk*XfbTiMi!eGu7t$8Kil3=j8m-vT~aDUXIjYj=Ol#CEb``y~y*Q z_v}>1Ogi@co40Ubdehz+mFaH%B9+36J>&k!{p@q9pHKXw|BSkwyTJ{kX=>A7|77yY zXhz@v>=2r&m2-c&Vm=-TZlm@N+XMembI^VEZf9hCM!bcu6pYVEisoHa@tOZp;3Zz*85ky? zvUxPv7Xf;3gym&gGaN-K9FO?x6hj@4-&V!%gQ5IQnULJAn=FY98_y+HE>df(71GZ3dKw%V3ay~T3Z1?WAnaDXm0GCWaTP(Po6gT3sx zRrTflxd|^aX<5>Z@gf8kFC?_5&`fEaf`S{+{Wz{4I*c*#yiZXbltF~LTZ!RjVIKxm zudx6_B+Rp}c)zV%hyztHW%`v;Cwu#uJ+ z>3J#U6j*7(^A%by$4c2~v~#!P4TL(KO~2HD+c_(P=0cBA4e#j6h_8lE^!7$ z4BL2~z4;8^&A7|hj)CCj1sKWy`Wx zxFX{15#-=zyfuO(k1W_Us9@s&j?cpsAK0q9`%W>9=SUxtgldNvO?h^GZg%@{yidiE zq7>nktX+|@c=;r6{Rflt)_*;C^>}y17Q9#RAqTLl`*kv(tWmTO@i}zm z@Gy*2c`)IJseuiD=6h-0_w9`CSCVd_Y#}X};8&5K8?~QYjj%3?7DEq?m%)l)I{>ZA z6c&nUup77ouRHDP{s^{2{PCCiZoFuxy}e0Twi|Ylh5Hhf`Ut9$pB*rEMfdyEA*}KI ze21n+lsYuvOn$BDVIH?LM8eZfC($eN4jp(N4M_)wS{|n!6@e{gW}| zqY96vcTwNkm(hft=}^Tw-z(O)UqD{N3^RR4>?2-rKUA^yl}>6$^opi0>!pzU7+lnLKXwds7NJD>AqSp|bnVEe=geIX--d1q&pG6EB`Tp!)S=Ue_Fm$Blg@#7pKrXp zKZoAUod{buI37_h7>{{FWIW8$b>p+#u7dFsa5t?Oat};TKHo+llfe*3$M(s-E1l<% zYB2VNJMkla(n9Z7z(!&@QS)#^Ka+DAD*u(VQ^4pQlGFVR2XE5dwS`r5{0~kJZ1^#$ z$#~d_Oqq^K{%^!ODML2wx^kV{SvfwFhLzSJtXn)BqO3vM%jh*jGA(GTq~BjY6C9&y z4-S5RS?nB`%3fSdj^Rmauk51b0yA)#Joabh|EKILK#5be>Doe_87+g+3)c@*g+p|y zV$s_Wr6fh)BMqepM2g;f$#}*tg9BdgCU1&jyG_>MtvPvrBSxmPmss;&X{l7y-sf00 zh2nq3yR!ggW7p)U-)37c-iGFhn38$SuVDWamSp!nYkc;1z66oMvmPXVKc~d2#5AYy zN7UD~@_ZxtTB5}IX~@Z|lYMsrajHrP^BWudn#0_5TKc4yvoXNn9kD~LnImnsb5CzS z&bNR%$}FH#|7H@CoCB(p^m#JI=gBbK>s96dUdxX^WmbT{Il+0Trb+RU986lVm43*p zTmJ_!J4eTi>RGS;=W4Dw{WT!e^bK3q%tHnxH81iBIUR#-0DC&~X`X2o#ZDhzv>6k8 ztkK{G(y{$&B0Zb|GNwq0S)D}n!+ZYy4SVwHc1Cd8!PTksTMJ)}?kjIGqnQmOiCb9j zb}2lV)DTUysXEvei~hrj?|zo-fNlM?LCa~C^Zlo6Bu?E0Pee}NLRNq1#O)_Xg zG!?I@yd7VFhhenP!jt^n=E}m1ZdkoLv2Z~3j7r0ZU1QK};?F!mU4}zrklU3<^$aQF(2Z`#R=mIWXgk&g`?5-X9R&u+HJG}a7~nqYy_W#&tH!^i%7Tkz zQYE*}2|g8i%&} zoTk0~mUtV8-h%bteb?ikFETc>uoM)}c)afkLVub0Bo?(e1)GtA1;Nf!u=+}M4a*Ju zJa3VNgGV4ie*cS?ns}Y*1AgzTJRZVBt;PJt7ghcCVX{I|9DBU`fqZVuFVYg&s>i4) z=c6rerAxO|(JBR={!!fYKuq$(*O9 zVAM`bD@*a_&==yS_W938u~Lq8!G&0N>v^L4uVe@uvS|7Vbw+Zir}i7_zxx`si~21G?eG6~_jT{6sd&vYBMkcBD_gL$Db zZ)SjA6Az|rA-k1hO=D`3CCj6%S(oDH{TOoldft!f(vv*m$RwWT786apxX3=Q4a9^E(4%=CT+45MHgLuAUNvTk3Gn03v#qWj>&-QAOj}-$zh{dZN(r+M zazEx!{7F+8opmrNC{bC6AO(k8PLnWPgGf!`T><#8&-*RBls$^(6y zWXbFC77UT5Qu^|~JB|9kLzFm;{|erHJtVX)T;avqqUBan<=GZgh~@5Wos zOSZK))ikeM+1%9F(AF{|YsiV|m$f%X!UG!W2G)k_8k)jsZQ;lX0~U+A zmQX`$Zfa9=WKb;vY7DI%)D&LbNd6<>$iT*M)AC6DfSd~k%(x)^@^EW&?!cAJwe5|~ zgPPh`R)<@2)54dn${iTKtUc72JGeExGStvi8*WVvRkx+CM3h#B)?`#SH#deuO}T^G z)~>8>Zp1m#+R(H-cSuWXb4|Fmy)~ShL5XV!H$?_Fg_nmS4XeVrgIk*08dyp>Bdxi% zHa9)ID%_MiFx1i#ZmJ#B3Ri1e7y+~ltZQhDgj)yKH8<8~H-_sX8FkIA+2K%4eL9pI z*A846rl_We+S;0H(pR@OM8d;O6rfGX8zQdOaGkwiLdh@}F325WQky-)fDv-T41hP&>`24PaQ4c!%+_$IHoLC1d1bau5P2vgf^ zYyzBV^`W-<>`17(F+9{0a|527P1!!e=SGPfne03R?Jv~c7#ZcmwPCcq@CkktUW25! zCHviQdDtJ;ityUDkv?A#>-KOGnGvE49PY&((HqQnK*$|#rR-2`tppBE*&9JSZ1X9! zA!w5Mqz7fbL;t8-bJdF=Vz^KXlp~O%|fJy%nO#5lvm~lF&h5Q z@jp56KRNLKFbAYLwl`Hbw>Q;htqQd^Q2%v)mR!KlofXPT45dQ^qsPu_uFJyE*W9{x z$hgS3x(O4<<*aIMs6|^(XhW`U$LQJ6L=?UGj0qF7CKv-FD{BIq99a`54w*P4Yf@JB zxC#Fc(|IVbQyrSb^gdD@wiA;s(A3Lu4)i2JIPilV90z*Lb$0MS{FnsCfgYOX`44)4 zLtKY^ig2Eyv26a)RE_lMA)o&^pB)E!=;4t6C}hWh9-5x`k5YCV=%J~G|G1bP2YP5e z=0BFR<3NuI-@DQxoaTuB<6G=F&_k0||3Qy_DgLw;=|8^5jsrb3OZOkYU`OwK{)=#( zpAQJv`M>0NnHIIR--kEeu#C1u@99`~y|dxZ1JcjX=7 zI=vqVSHU_T3r`9Z{(T`_=Yy$#2YPgQWpIE8dUSaOgzNt2Na4EwIbOKw|Gb1v5U%^B zGlb)(iAl%#!gYBS3dfHSla6BH`1xVdu|PPjp7;;i=!p8Ck$wodM))Yj8-?Sihe^jO z;ig~rE?p&D*Q=QDBRy4?z9*c14D3ICE*w7rOgergoVF74AAb;zp8_Tw{~;W2IVT-| z6+SkJI?gWPy8b^W96tk0I{q#kKLt!W_6g5QqK@;a@DmhI;o26-7p}+Ci-ha(be?cMo?asSbT3Gj>V;=3ewpw| zieE1L48^YzK3Vba3fJTK&xGr7{MW+IQvUo!_}Pl{IxyPTIf_3a`r00NS@?NM-}JKw zdZsG=vFJ}z{A=OH4)QK$a0hvyXS#=28YNuYA!CJOAvEbQi{=MEkQh1@_5#bjqzFzoj#jh3aD*iL!MT-AY_(h8UQTQCi z|0-Nh?z@B+EB)t$&sF>%!b=qYK)A7Uy^CK8FY^#fgL%L_&{MAX;le8vKVEpH;-?9p zr}%lo=PN!-_yWb}3SX%BBH@b^4+&qa_)6hR6kj9!V#U`BU#j>f;g=}>ec@G#-zLxf+d zIPFP6_QnduvxGM)K9MU zoHfEvQv7P+dc5ltuE(7lgzNF*$HH}gev5G35C2NI?pN;+uKT^agzNt8LE*X|+b&%9 zSC0zU{nFFIb^r5%aNW+GhRlM7;g2ZZDSVgW-xvO@;x`L_S@GWp->dkag}<-(L&85*{BhxU`kQpTBz%bC zdxQ^DJT82s;s=C}R{Trh$0||3SO^ zkpCAcK0~-!|M2dZEqsB}FBQI2@uk97D85|yD#athql#ZCe6!-4gx{q24~73$@mq!8 ztN5M5d5di?xz1mO?^gPc3V&Pi=Y+qn_-n!sDjpY}HozAs#E*oJQv3_yM=PE_nC?gY zQJi*aB7Te1h-`6`vwJsQ7f@^A(>Ze2L;039nLozVLd*YlTM?j|jh7@pZzl zQT!U=H!A*p;kPROQ{lHOPJ3HXe*Q)AyM=F6e7o?+6@Nzfi;BN4{0+t575<*$p9ud% z@f2R5N_F%?{BYsJmFabq@S_zUFZ@)+&k#Oc@$-b|DNcKRQNEQZUM##y@k-$<6kjU* zTZ-2S-=uhp@LLpLE8NWQDQ@Q2AiPWIUnl%U#eXFH9mQ`I{<-3R5I&UWXEs#Fxkva> zia#WLoZ>r$Pf`3C;RTAnBHYZsy>Q=jF?y0hrGL%lKPLt9f%Dne;nWIF1 ztSW7=kCvUPla&3{!=6V{95_bC_F=Xv_|~V_WwrFKSAk#U-b2Q z=53-sRq6ju^!0k_J)&Q%^dAylqIj3^GR2<|UZMDN!WS$4itswc_XuxM{2k$|75`B9 z8pS^szE<&+VW$3EuJ};q2YM8CXrDi-Z&#}eCR1;XhaWD&fCY{CeTW9`WM;bK&a{ z@ZE~<6~0ID_k|n##S8cg=DeujK}c!bkq}QdfJO+OVk(JVaqDH?XH7k}0(f39Vo z;=HaFYHtz#XSGm!hw!^?fO5Xa`lI+x;d@j+`JC_x$;ovxxr0n`j^=XqJbO*_=c{_s zE&Ocd&!@s&#Z!2JC&jr|@xj6$P<)i|?TU{TzDMzi!UrgO>0IF>6weoay5d3M=J}qN z4~v8sDE&I&xr#@G|55RE!nK{bN%(f9|0Ch%xt157UkNwQuRMOY@XwV$UBb0}xLf!f zWzXytUa0s#g`4M5Ubv~eP?zFNQ~E~;U!r)H@FvBxh2N+6bm7{5D-=FP)$_T+&sBWB z@EM9P6MmiI4Z^kEa+&bkl>S=bzfk;Y;jby)DSU_G-xL0X;x`LFU3JC3626evA-r2Y6l0^XF;djY|I|;by(u(|JuOgYdVN{(ZuyDt-Rmn3LiZDgK=3*D3y%@HuK+_(1rDihnNr z7s{Uuevu)?F~8;U@_D527nS}v;by(f(?3Uet_pXi@H-U0NccmF&lg_6^KZ}pON4hT zzFhcn#oL6hR{Yz-&ANr>|0dyP9_jHP2>&kI-5$S1xTE~PU3jMAe-fUh_yfW}RQd3T z@X1R5DdEQ{1L*IU|Hw!;O*->kSAI|oXmk(D9AFKE#%lYi--ypn7>E9&0N%32S zKdSg2g#VDobI`lw-kR>_!o-5Exb(ClTU=7s(2c| zn3m!M6+cY)tBRi>{9B5jA$*tOIl{kGyjXZGk5^tkTrB(!HD7BG{=Cv(E&NzjpF4!> zcJW=|tCjxE!kZQUeLwtu;ig~r;=fCHO!@PI@Vga%L-L!h3{2-j_}i!|K-AGC|)o8YPBHPEc_0| zR|)@2@hgPqkMYt(Qit$WipPZiR`KhEzp3~SgdeLGI)5U3zT&qEU#IwQg#S?SKMMb& z;`a%EUh!?h|5Nctg@R>HNY-it~ix zql6DuFPI)He2U^H39nZC4B^?wdTAx;T;Y|9Um*NO#S4VLs(7*RA?n4}g~HENyhiw9 z#T$iRr}!G-k14)E_(zK0ApD-=lhgYn;U6o0i}2&JlJ$Qh+*SN9!vC)LL&85%e24JX z6O#RZTKE@=za;#s6O;Ad6#k~-?+ZU-T(bUW!Xt`1+%Kd!yA>ZS{K)ai{v0WMs^VF~ zV~S@B&pavFpYw#*DLza1fRmH;ON6&8ezEW$DBd9a5ye*v|4Q)=;TaQ?!`&?WT*d!g z_*%tp5q_iMw+k?cj_`KH7YV;l@oM3p zE8Zgfdy|v>zgqa>^OO1Y!skv;=06kuTg87b{OO!z{dwc>9J z|J$@={m+H}Qt1!p@h`>6Ju_MV2;qwrpD296S;_i2!hfcCQ25^zzeITB*~$L22;Zmp zCgJyse&Nf`OV%IAc0h`AO-Ozwp}>|62H; z6gPHuigT>8#}4OmN^zDee!TD>D}I{r{feI_{2z+X5`Ma}>xzYcOYsH5f2w#$_-@5l z2%nt@tG2Zzw)Z_-Be2 z2tP&H)#bvcE51zlKNW8fKJIj1;X+(3{5-`s2tQNV=hq59QSqCES1bMt;j0w?v+y@3 zCCBFh;ky+#^Zyj*9>t#*{pS>aLwLR7?+O35;$H~=Q1KBwKBYLCj}e}x<`*XlZ&3Vn z;eSy4T;cC4o-h0wHBT|)Zi-W*?EHD6zd-S@@Ea43|F0E(z2X~$|5EYqGRGH9 z>;`~X)XRq*GioYxT8O1*m{^-*BE?Bp{Al4L6hBFLQ1P>c7b>17e1qb1gfCR{riH@qSG-R6g=&7(F8oWy z*9%{)=0}~va~1!g@a2mCLikS<|C8{)EB=u1+ZBII_-@5t5I*ueC+T=Yc%|YW3O`=) zuY{KW7~v{7*{% zLgCvLUo70cAUQrY!iOtNl}3_KR?L&bY@)=j2=m>L)!^fSwCjx!wa`CzqG2N zXmO!4v#1IgK&Og%GwD=3FG#1tGWs8^r2n(||E!X^737+gU(P4w8eDVd1%ss|P!6y# zw}jOTiYiKj`HNVma6u3yK_ZnYp9|;Cu5^t=|7Y{n#f9Z1>_>4)!MtDzU6?zscxIvT zxUg(KUo0$}mv6!>FD%YSZ7JlK^j6(gf@Uvd6II?XI8F{&t+nO5X%H<2zcnZ-ic zypqbILKG$iSvWhtvS@yx(I}}XN;nFN=95B6L4k?L{KB~`oua3+=)&Mz!S26GJf z+Jz{46Tu5hf(4wn7nY!A&EnMKPE0ky5II&^0;i}{mH?1E%gryZETIYu2TqkGMC=vhsEgJrdbow<`DmXdtOH4cg+$E& znvf7LkyyVte-1K$V~?3E>Qg@R>my2=8ooeOCmkubmp))S5YW@7o8KCRXM9vx*X`k zA$^i@p!RcTWnATjv$!Tet3pa1qUi&nLCvdTuE|c45ls`LdF9+QK?OCSz@`}um7<6$ znuv>Ai5fhI;|P%>ji^;9< zLamTcD{TLOi*CNTrNZ;GBGII0mCQrk!sdr7TOw81D%OhFUe}RbkE?3xom$@ZkfgS{ zDwauTsH6X8YebT;RcdvpX*r2z6K0ZlA7)132%Ts*W;$a-W;!*u(tp~P*{N=-!ltcs z!rr`eTG`%6r|@O;zcE7pm-Bzxw3%Gkx0z41e4^c(TgXitIJ1C_AjvJ;IFl%8B9XR{ zoMS>8JF_2VZ)dt-b~a{+9iHWkO`cgw?DI^T*y@>1*zK85p*3`(J)c?C z?80kA-u9VA+JKS;yYDmIW4C@b8nXK{J8BzNkpgysW+!a~&4SsbnJ&q8&?I6vo`My&4{*#CV}@eCIMB%?7S=v?1L+k7cg|fmvMl|u}Cx3 zDsyL~8GvNkhdI)W?Uu=bQ>2-Qy}~;~^Zi6|3(IB;XVQTr!9qfv6Gm0mTxEUQAQ;yL zMVb@Ejbe{9%M}WMwdpDgW?N{wi?)TPGj@iilWY#nN@h=J+8&y&7?;@~n%uNUG@WUi zXzV#kB5x2)dRCvk;asKtp^4Htky+UDnPOy81c%uun$+Nst)j(6n?;LA+eKR)+Ax}A z+9jH{jJ7gu7)>%ZjHbP!Nu<4^rI5ndZ$RzGg}jO=fvRjbjEZ^slpvW>wL!DZni#H@#_f zLse5~W!QKl8`83uA}4}FS41tGuZf(v*4(_3InK=5sv@oJVZ^x(Sw!cihDQ9SooaDn zZ`!J=8%U-q)mGKm62k7^5L&I!hAKmMw%Fd;N)mwS&(XuRneH5wRjwE>&a7&pAdSPw zwapO}N*ncR?QJ+ywo7npSBfuGeNcBWGE`a7L?GdmF(TnM14Y8gqea4n7Lkx?+(+x|6a9-qfrJM=1OT46!ZYnubtg75d$k zf@HVhHm5b*(pVKinM`7-shNrzg0x@~jh#gj zdS~o2&o@w&Vqs-yZFQIo1a=_@IV+)zs*6uMFy(H9JTM&zN!)s=e`f{UPWsjhR56SW zq(&EN8 zA=`1b6$B#LIg`kGFdbNU6($3Xb%ZEq`3wV*&r+>%1@i||kRgh7Wd=dAOd&`#a|njq zwX8C;2m&;XpfhsT>#bmGN6<>bjnzm`4W*96<&DkNR+hfN!;)|U(yLMY%*2HJrxA_D zUy@}=tHbwb{BCsEuo=eg^x|(J+kp|mO+L*R^F@>0jDP$Yd z1hz4yYo`B|4DupqMp09gh>UUK`xlfEtJq+v#c0nZMrYU(O|>XeTw_;rEt)AQlB=e< zu@N=b15~|h9d3bkijh#}^d?-(oB1vtxf78whRpwwSXi_TW)h1NO=4k9nn^4gnVH0b&?J@` z8-I(4b1C5q~x2MQUEkOz`CaR(JYqEW)_QN(8LwD(!>=f znz%ODi7QgagACtdMkE$x;@ZID6@9RX?(t1rxxe7g7O^@{T+w0h#1&zii7SHUj~LOt zwpMWr_#QiPZ9r?_i7N@{wj}TAi$)w@nYh9;GjVOO6IaCDo4B%rXD%#x0Yir;uAE6S z|6vuGxT27}iE9J(;dbI`uGopIaUr8Q^5{AxFi2z?AzhGoy2_H(qS1lVEE8A0XeX|w zsAb}60^s|o010Kl2`Yl5DWw^cph>r~mpnEllt>vvfVEhlhzTp#Qku&emz~TS7n%Wm_{d%~(^+%L z%x4>T4qIivdqj$C;gYR_NM zr%=dxXIB-c)aRCB^bslIWI`haeHV%2?D=LsjijKRE+>U+=DJD9OrVnxhFyFlN%@CD zka;yVWZ3^4HGjm}5=h)dE}m?Q*W^ao@K=+Pl#=2^S_sK>r_~|pZ6O$Atr~MzvQTk0 z{V)W%VlBmLYbC;57bA!y)1jk`n;TbQ5+hX+<8Ny-78)b9Y;aW9Qt86`TB^fb8zxmZ z+MpT}K{eMJu{IoTF}1V@sLA0(Qt%_u;&zM)U_i#8RZH3{! z;i9ggmCShKQw%7jppd1gx&DAm3z5;`tauZ<+4)rNAEyPM8z zqhZbGl6<2JB>Jvc&(8G1hUlZl;Hqu|Wh1z{CREjqfs5)O_rx|->VuPH@dSOc#Uu(P z>)Na>OsXc?CYNNC1%UvEJofGdY49&gDYapoD3mPl=|VWO`CFz^vM=tW9df{F-NX zB8Zo88EwKm;v}46*5SfRs?G^+3J{nC;|)iqjw8W?QK$yZqo&UGLL^C=(VG~LsxeLp zL))_Ta&_V|ZV^RD{+QJxwLF)tZuPvaYLnW9ykwcZrsq0^bMaIe&wL=yojH%5t5=Y0 zM65L8kusck0EH){RWlb=7V_oF5`0@uoZOLfpO3X3%uJ|saps=ToTZA1gM-F$r&$%j zhceN<)JJOYkcOkpBJ~=k@v+mk*p;|V>IqhTQPpch5o+vM@a5H0UX>shs} zX;_p@CAtFrFW+5@EJJjfUesl)vbh~^qa83In38Xx zsVyxULSTYu;PDS$P_eH`4uDL5k-QXsZDl6^H;nkf9s`OMr*{MCSg1I@*~>?j;=@G0 zPI3G0%w>w({poI3e7yK`pW@?$KkMTZLmQu?OmsP|Bn}b1n-w?vIXljLN<0oakxE(y zxg6*Fid%ouQ_Xd{On>Y0jK{5tH%dI$YA*WM^ux_}SG;nu{y(bpzmoELM)5QW*L+9C z^XD+(`<1@Uw}ENN>9YO|SKQWFwE>d6~&rgRav`;h)q@kVi{4o>#R?q_+353$4}IM4|4)6K{5SitJI>#H z+^_$#kCXmVsb`<~xL^M(A1D1wMSrwpIO+QJkMnWTxBIlt@^QcZMLtgYHh7s*&Hk^R|F%8;)TdA3-X!7v zM)BK(->vxXgl|{;FT$Tu`~l&wDZX8Jx8jcrKdAU~!qbN%(l{us6#rL+M@JC#xDB^> zWHNtK^lL{Y^J9gtKicE|{M^_NzrP>;NI(4V{qVQ?;s5N1f8pbl57Hc*p~v(c{}0CX z%|Gpj4;wl5rcHCT~xb=UT;?@rAP~3*wskrs$ zdy3n1{X}sa&+mxgYxBqE+rx@m{YMqI{y(d@jnB)9+xYKQ-1@&yahq=+D{lS&QgNGa z0r_2zO_vRKwBpvE;}y5*Iz@3C&&TC=H{?In^LDA{Z^--emP_~L>{s0O!=EZX%2a!2 zfV@|4{jvS?V8xFR{Ua2&{q|VJ$BO<0#ch9nhT zBS3YB{$@+Q-6{3R@*?5)C_YE{7RBwnbf@AaqW`qwWx{tWULoA><89+(=eKdCf3fI) zsQ5DB2Nk#TUi*n~>wlx@XUIIl@)qHlimwqqM)CE+vlQPTe1hWN5k6V*>x55L{08B9 zir*;QRs3e*rHcPb_(H{hCw!UWe->V^_=Cb*6yGX*jpC08U$6Ks;TsiyR`~UbzbyPl z#rF#Tx#I5&|FzQ1R)aZ@!CY`T#=qds-O-IeDCX;und2rsDQ{T4NNq-_tVROZ5D= z-_x3)^zHYwCM#~gr!`e^`#r5Z#qIaBT*dA8v`Q7X-_u&Cxc#2iGR5upwCWYN-_vSQ z+-?`iE(+Pb))l`#ml59YwDk?f10CD1G~#gDl1E_p~M`{*??|{$D{jB1wOeuf zJ*_>8+wW<`6}R8h`cQGZo_kR7#P_shy}{P2#P_r&;mr`d@PRiTBX}`}&h=Jm4L61+ zMfhPli+B(g!t)&bfZ+f9$buIX7iq2u5A#I&&>FnrCSCtQ%MN7f<@q7W|6xGO2y-U? z>0U{`Gsa+tmIH`OaS3&t$+VcL`U<~go6*RU1riFM!m#(-@M$_pOoyN4 z0^(S|EIGyYesk5tUAh2^_-yabyU1Xw4xz2AmU%eOjgx?`CboIg8}T;7o!8^;-m VOMTsc{S)RMwXFi@wdb4T{BJCTP8I+F diff --git a/bench.py b/bench.py index ca700eb..33b3ddd 100644 --- a/bench.py +++ b/bench.py @@ -1,13 +1,13 @@ #!/usr/bin/env python3 """ -bench.py — benchmarks for uncommonlisp. +bench.py — benchmarks for lumbda. Compares interpreter time against equivalent CPython. Usage: python3 bench.py [-v] """ import sys, time, math sys.setrecursionlimit(10000) -from uncommonlisp import make_global_env, read_all, leval, PRELUDE, show, bc_compile_proc, Proc +from lumbda import make_global_env, read_all, leval, PRELUDE, show, bc_compile_proc, Proc VERBOSE = '-v' in sys.argv @@ -56,7 +56,7 @@ def bench(name, lisp_src, python_fn, iters=3): return lisp_best, py_best -print('uncommonlisp benchmarks') +print('lumbda benchmarks') print('=' * 75) # ── 1. Fibonacci (iterative, named let) ────────────────────────────────────── @@ -388,7 +388,7 @@ print() print('AUTO-COMPILE mode (auto-compile! #t)') print('=' * 75) -from uncommonlisp import _auto_compile +from lumbda import _auto_compile def bench_auto(name, lisp_src, python_fn, iters=3): """Time auto-compiled lisp vs python. Defines + runs in one pass.""" diff --git a/c/.gitignore b/c/.gitignore index 519e1fc..77c71aa 100644 --- a/c/.gitignore +++ b/c/.gitignore @@ -1,5 +1,5 @@ *.o -uncommonlisp +lumbda test_runner test_runner_dbg bench_runner diff --git a/c/Makefile b/c/Makefile index 6e26a65..751dd40 100644 --- a/c/Makefile +++ b/c/Makefile @@ -1,4 +1,4 @@ -# Makefile for uncommonlisp C interpreter +# Makefile for lumbda C interpreter # Targets: all, test, bench, clean CC = gcc @@ -15,9 +15,9 @@ OBJS = $(SRCS:.c=.o) .PHONY: all clean test bench -all: uncommonlisp +all: lumbda -uncommonlisp: main.o $(OBJS) +lumbda: main.o $(OBJS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test: test_runner @@ -26,14 +26,14 @@ test: test_runner test_runner: test.c $(OBJS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -bench: bench_runner uncommonlisp +bench: bench_runner lumbda ulimit -s 65536 && ./bench_runner bench_runner: bench.c $(OBJS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -%.o: %.c uncommonlisp.h +%.o: %.c lumbda.h $(CC) $(CFLAGS) -c -o $@ $< clean: - rm -f *.o uncommonlisp test_runner bench_runner + rm -f *.o lumbda test_runner bench_runner diff --git a/c/TODO-named-let-bytecode.md b/c/TODO-named-let-bytecode.md index 5ee5f70..e8c8ad2 100644 --- a/c/TODO-named-let-bytecode.md +++ b/c/TODO-named-let-bytecode.md @@ -13,8 +13,8 @@ Expected output: `4` -Actual with `c/uncommonlisp --fast`: hangs or segfaults. -Tree-walker (`c/uncommonlisp` default) works correctly. +Actual with `c/lumbda --fast`: hangs or segfaults. +Tree-walker (`c/lumbda` default) works correctly. Python `--fast` and asm tree-walker both work correctly. ## What's special diff --git a/c/bench.c b/c/bench.c index f409d3d..7f1e36b 100644 --- a/c/bench.c +++ b/c/bench.c @@ -1,7 +1,7 @@ /* * bench.c — Benchmarks: interpreted vs compiled vs JIT */ -#include "uncommonlisp.h" +#include "lumbda.h" #include "jit.h" static double bench_time(void) { @@ -184,7 +184,7 @@ int main(void) { return 1; } - printf("uncommonlisp C benchmarks — interpreted vs compiled vs JIT\n"); + printf("lumbda C benchmarks — interpreted vs compiled vs JIT\n"); printf("═════════════════════════════════════════════════════════════════\n"); const char *modes[] = { "interp", "compiled", "jit", NULL }; diff --git a/c/builtins.c b/c/builtins.c index a330b88..16b64a6 100644 --- a/c/builtins.c +++ b/c/builtins.c @@ -1,7 +1,7 @@ /* * builtins.c — All built-in functions for the Scheme interpreter */ -#include "uncommonlisp.h" +#include "lumbda.h" /* ═══════════════════════════════════════════════════════════════════════════ * Helper macros @@ -1926,7 +1926,7 @@ Env *make_global_env(void) { env_define(g, intern("else"), VAL_TRUE); env_define(g, intern("..."), intern("...")); env_define(g, intern("*version*"), make_string_from_cstr("1.0.0")); - env_define(g, intern("*name*"), make_string_from_cstr("uncommonlisp")); + env_define(g, intern("*name*"), make_string_from_cstr("lumbda")); /* Portal builtins */ register_portal_builtins(g); diff --git a/c/eval.c b/c/eval.c index 57dd3ad..f26c333 100644 --- a/c/eval.c +++ b/c/eval.c @@ -3,7 +3,7 @@ * * Port of the Python leval() function with full special form support. */ -#include "uncommonlisp.h" +#include "lumbda.h" #include "jit.h" /* ═══════════════════════════════════════════════════════════════════════════ diff --git a/c/jit.c b/c/jit.c index 5423b7b..1525127 100644 --- a/c/jit.c +++ b/c/jit.c @@ -1,5 +1,5 @@ /* - * jit.c — x86_64 native code JIT compiler for uncommonlisp + * jit.c — x86_64 native code JIT compiler for lumbda * * Emits real machine code bytes into mmap'd executable memory. * Handles: integer arithmetic (+, -, *), comparisons (=, <, >, <=, >=), @@ -9,7 +9,7 @@ * * Code outlasts authors. */ -#include "uncommonlisp.h" +#include "lumbda.h" #include "jit.h" #include diff --git a/c/jit.h b/c/jit.h index f464162..ef0cc17 100644 --- a/c/jit.h +++ b/c/jit.h @@ -1,5 +1,5 @@ /* - * jit.h — x86_64 JIT compiler for uncommonlisp + * jit.h — x86_64 JIT compiler for lumbda * * Compiles Scheme procedures to native machine code. * Uses mmap(PROT_READ|PROT_WRITE|PROT_EXEC) for executable memory. @@ -9,7 +9,7 @@ #ifndef JIT_H #define JIT_H -#include "uncommonlisp.h" +#include "lumbda.h" /* A JIT-compiled function takes NaN-boxed Value args and returns a Value. * System V AMD64 ABI: args in rdi, rsi, rdx, rcx, r8, r9 */ diff --git a/c/uncommonlisp.h b/c/lumbda.h similarity index 99% rename from c/uncommonlisp.h rename to c/lumbda.h index fb432e1..0533ac5 100644 --- a/c/uncommonlisp.h +++ b/c/lumbda.h @@ -1,11 +1,11 @@ /* - * uncommonlisp.h — A Scheme interpreter in C (NaN-boxed values, Boehm-style GC) + * lumbda.h — A Scheme interpreter in C (NaN-boxed values, Boehm-style GC) * - * Complete port of uncommonlisp.py. + * Complete port of lumbda.py. * Part of the permacomputer platform — code outlasts authors. */ -#ifndef UNCOMMONLISP_H -#define UNCOMMONLISP_H +#ifndef LUMBDA_H +#define LUMBDA_H #include #include @@ -763,4 +763,4 @@ typedef struct Module { extern Module *g_modules; -#endif /* UNCOMMONLISP_H */ +#endif /* LUMBDA_H */ diff --git a/c/main.c b/c/main.c index 0f71328..45fab55 100644 --- a/c/main.c +++ b/c/main.c @@ -1,7 +1,7 @@ /* * main.c — REPL, script mode, -e mode */ -#include "uncommonlisp.h" +#include "lumbda.h" #include "jit.h" /* ═══════════════════════════════════════════════════════════════════════════ @@ -16,7 +16,7 @@ static char *find_stdlib(const char *argv0) { ssize_t n = readlink("/proc/self/exe", path, sizeof(path) - 1); if (n > 0) { path[n] = '\0'; - /* Go up one directory (from c/uncommonlisp to uncommonlisp/) */ + /* Go up one directory (from c/lumbda to lumbda/) */ char *slash = strrchr(path, '/'); if (slash) { *slash = '\0'; @@ -51,7 +51,7 @@ static char *find_stdlib(const char *argv0) { static void repl(Env *env) { char *version_str = show(env_lookup(env, intern("*version*")), true); - printf("uncommonlisp %s (C) — (exit) to quit, (load \"file.lsp\") to load\n", version_str); + printf("lumbda %s (C) — (exit) to quit, (load \"file.lsp\") to load\n", version_str); ul_free(version_str); char buf[16384]; @@ -161,10 +161,10 @@ int main(int argc, char **argv) { } if (help) { - printf("uncommonlisp — a Scheme interpreter in C\n\n" - "Usage: uncommonlisp [options] [script.lsp] [args...]\n" - " uncommonlisp -e '(+ 1 2)'\n" - " uncommonlisp (interactive REPL)\n\n" + printf("lumbda — a Scheme interpreter in C\n\n" + "Usage: lumbda [options] [script.lsp] [args...]\n" + " lumbda -e '(+ 1 2)'\n" + " lumbda (interactive REPL)\n\n" "Options:\n" " -e EXPR evaluate expression and print result\n" " -f, --fast auto-compile all defines (bytecode VM;\n" @@ -178,7 +178,7 @@ int main(int argc, char **argv) { } if (version) { - printf("uncommonlisp 1.0.0 (C)\n"); + printf("lumbda 1.0.0 (C)\n"); return 0; } diff --git a/c/portal.c b/c/portal.c index 2b3d7da..092ceda 100644 --- a/c/portal.c +++ b/c/portal.c @@ -4,7 +4,7 @@ * Port of the Python portal_save/portal_resume system. * Serializes environment bindings and full continuations. */ -#include "uncommonlisp.h" +#include "lumbda.h" /* ═══════════════════════════════════════════════════════════════════════════ * Portal checkpoint — thread-local signal for mid-execution save @@ -188,7 +188,7 @@ void portal_save(Env *env, const char *path, FullCont *continuation) { return; } - fputs("{\"format\":\"uncommonlisp-portal-v1\",\n", fp); + fputs("{\"format\":\"lumbda-portal-v1\",\n", fp); /* Environment bindings (user-defined only from global) */ fputs("\"env\":", fp); @@ -620,7 +620,7 @@ bool portal_resume(const char *path, Env *base_env, Env **out_env, FullCont **ou /* Check format */ const char *fmt = json_str(json_obj_get(root, "format")); - if (!fmt || strcmp(fmt, "uncommonlisp-portal-v1") != 0) { + if (!fmt || strcmp(fmt, "lumbda-portal-v1") != 0) { json_free(root); return false; } diff --git a/c/printer.c b/c/printer.c index 9149200..b5a004c 100644 --- a/c/printer.c +++ b/c/printer.c @@ -1,7 +1,7 @@ /* * printer.c — show/display/write for Scheme values */ -#include "uncommonlisp.h" +#include "lumbda.h" /* Dynamic string builder */ typedef struct { diff --git a/c/reader.c b/c/reader.c index 4bf74eb..045f863 100644 --- a/c/reader.c +++ b/c/reader.c @@ -1,7 +1,7 @@ /* * reader.c — Tokenizer + parser for Scheme source */ -#include "uncommonlisp.h" +#include "lumbda.h" /* ═══════════════════════════════════════════════════════════════════════════ * Tokenizer diff --git a/c/test.c b/c/test.c index 3be0ddd..9ae28f7 100644 --- a/c/test.c +++ b/c/test.c @@ -1,7 +1,7 @@ /* * test.c — Unit + integration tests for the C Scheme interpreter */ -#include "uncommonlisp.h" +#include "lumbda.h" #include "jit.h" static int tests_run = 0; @@ -876,7 +876,7 @@ TEST(portal_checkpoint_builtin) { int main(void) { init_symbols(); - printf("Running uncommonlisp C tests...\n\n"); + printf("Running lumbda C tests...\n\n"); printf("[types]\n"); run_test_nan_boxing_int(); run_test_nan_boxing_double(); diff --git a/c/types.c b/c/types.c index c24786a..71fab66 100644 --- a/c/types.c +++ b/c/types.c @@ -1,7 +1,7 @@ /* * types.c — Value types, NaN-boxing, symbol interning, Env, Pair, etc. */ -#include "uncommonlisp.h" +#include "lumbda.h" /* ═══════════════════════════════════════════════════════════════════════════ * Error context (thread-local) diff --git a/c/vm.c b/c/vm.c index 9bc5618..0633a31 100644 --- a/c/vm.c +++ b/c/vm.c @@ -1,7 +1,7 @@ /* * vm.c — Bytecode compiler + stack-based VM */ -#include "uncommonlisp.h" +#include "lumbda.h" /* ═══════════════════════════════════════════════════════════════════════════ * CodeObj @@ -625,7 +625,7 @@ void bc_compile(Value expr, CodeObj *code, Env *env, bool tail) { ul_free(call_args); } -/* syntax_transform_value is declared in uncommonlisp.h, implemented in eval.c */ +/* syntax_transform_value is declared in lumbda.h, implemented in eval.c */ /* ═══════════════════════════════════════════════════════════════════════════ * Compile a Proc into a CompiledProc diff --git a/docs/README.md b/docs/README.md index 80e9afa..95cb892 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,10 @@ -# uncommonlisp Architecture Documentation +# lumbda Architecture Documentation > "A diagram is worth 10,000 words." — russell@unturf.com Three implementations of the same Scheme language, sharing the same .lsp test files. -## Python Implementation (uncommonlisp.py) +## Python Implementation (lumbda.py) 3,324 lines. Bytecode compiler + stack VM + full continuations + portal. @@ -118,5 +118,5 @@ make test-all Total: 943 assertions ``` -The language is **R7RS Scheme**. uncommonlisp is the project name — a play on +The language is **R7RS Scheme**. lumbda is the project name — a play on Common Lisp, since this is decidedly uncommon. diff --git a/docs/c-architecture.dot b/docs/c-architecture.dot index 5331408..f3a3a42 100644 --- a/docs/c-architecture.dot +++ b/docs/c-architecture.dot @@ -21,7 +21,7 @@ digraph c_arch { } subgraph cluster_types { - label="Types (types.c, uncommonlisp.h)" + label="Types (types.c, lumbda.h)" style=rounded color="#666666" nanbox [label="NaN-Boxing\n64-bit doubles\ntype tags in NaN payload\nzero-alloc numbers" fillcolor="#e2d5f1"] diff --git a/examples/bench-hashset.lsp b/examples/bench-hashset.lsp index e2e4960..7243a56 100644 --- a/examples/bench-hashset.lsp +++ b/examples/bench-hashset.lsp @@ -3,7 +3,7 @@ ;;; ASM-ONLY: exercises the native hash-set-* primitives introduced ;;; alongside the portable-lib equivalent. C and Python tiers do not ;;; carry hash-set builtins (they have hash-table), so this file is -;;; driven from tests/bench-hashset.sh against asm/uncommonlisp only. +;;; driven from tests/bench-hashset.sh against asm/lumbda only. ;;; ;;; Phases: insert-N, hit-lookup-N, miss-lookup-N. ;;; Output: ms per phase + speedup (portable/native). diff --git a/examples/fibonacci.lsp b/examples/fibonacci.lsp index 142117a..68783e9 100644 --- a/examples/fibonacci.lsp +++ b/examples/fibonacci.lsp @@ -1,5 +1,5 @@ ;;; fibonacci.lsp — iterative and recursive Fibonacci -;;; Run: python3 uncommonlisp.py --fast examples/fibonacci.lsp +;;; Run: python3 lumbda.py --fast examples/fibonacci.lsp (define (fib-iter n) (let loop ((a 0) (b 1) (i 0)) diff --git a/examples/generator.lsp b/examples/generator.lsp index 72adb09..d95fb9b 100644 --- a/examples/generator.lsp +++ b/examples/generator.lsp @@ -1,5 +1,5 @@ ;;; generator.lsp — coroutine-style generators using full continuations -;;; Run: python3 uncommonlisp.py --fast examples/generator.lsp +;;; Run: python3 lumbda.py --fast examples/generator.lsp (define (make-generator thunk) (let ((k #f) (done #f)) diff --git a/examples/http-client-bench.lsp b/examples/http-client-bench.lsp index 482d96a..d897d8e 100644 --- a/examples/http-client-bench.lsp +++ b/examples/http-client-bench.lsp @@ -10,9 +10,9 @@ ;;; server throughput shows up. ;;; ;;; Usage: -;;; python3 uncommonlisp.py --fast examples/http-client-bench.lsp -;;; ./c/uncommonlisp examples/http-client-bench.lsp -;;; ./asm/uncommonlisp < examples/http-client-bench.lsp +;;; python3 lumbda.py --fast examples/http-client-bench.lsp +;;; ./c/lumbda examples/http-client-bench.lsp +;;; ./asm/lumbda < examples/http-client-bench.lsp ;;; ;;; Override N or PORT by pre-setting *n-requests* / *port* before load. diff --git a/examples/http-server-noarena.lsp b/examples/http-server-noarena.lsp index edaa8cc..69d1c27 100644 --- a/examples/http-server-noarena.lsp +++ b/examples/http-server-noarena.lsp @@ -56,7 +56,7 @@ (cond ((string=? path "/") (http-response "200 OK" "text/html" - "uncommonlisp

feedback is all you need

")) + "lumbda

feedback is all you need

")) ((string=? path "/bench") (http-response "200 OK" "text/plain" *bench-body*)) (else diff --git a/examples/http-server.lsp b/examples/http-server.lsp index bda5760..19ff20f 100644 --- a/examples/http-server.lsp +++ b/examples/http-server.lsp @@ -3,9 +3,9 @@ ;;; Runs identically in Python, C, and asm. The only primitives used are ;;; the six socket builtins + display/string-append/substring. ;;; -;;; python3 uncommonlisp.py --fast examples/http-server.lsp -;;; ./c/uncommonlisp examples/http-server.lsp -;;; ./asm/uncommonlisp < examples/http-server.lsp +;;; python3 lumbda.py --fast examples/http-server.lsp +;;; ./c/lumbda examples/http-server.lsp +;;; ./asm/lumbda < examples/http-server.lsp ;;; ;;; Default port 8080. First-line dispatch: GET / → greeting page. ;;; GET /bench → 1 KB body for throughput benchmarks. @@ -76,7 +76,7 @@ (cond ((string=? path "/") (http-response "200 OK" "text/html" - "uncommonlisp

feedback is all you need

portable HTTP in Scheme.

")) + "lumbda

feedback is all you need

portable HTTP in Scheme.

")) ((string=? path "/bench") (http-response "200 OK" "text/plain" *bench-body*)) ((string=? path "/hello") @@ -110,7 +110,7 @@ (server-loop (+ n 1) snap)))) (define (serve) - (display "uncommonlisp http server on :") (display *port*) + (display "lumbda http server on :") (display *port*) (display " (max ") (display *max-requests*) (display " requests)") (newline) (server-loop 0 (heap-snapshot))) diff --git a/examples/mergesort.lsp b/examples/mergesort.lsp index 99672f3..f027eab 100644 --- a/examples/mergesort.lsp +++ b/examples/mergesort.lsp @@ -1,5 +1,5 @@ ;;; mergesort.lsp — functional merge sort -;;; Run: python3 uncommonlisp.py --fast examples/mergesort.lsp +;;; Run: python3 lumbda.py --fast examples/mergesort.lsp (define (merge a b) (cond ((null? a) b) diff --git a/examples/objects.lsp b/examples/objects.lsp index 8ff9409..2f84860 100644 --- a/examples/objects.lsp +++ b/examples/objects.lsp @@ -1,5 +1,5 @@ ;;; objects.lsp — record types, closures as objects, hash tables -;;; Run: python3 uncommonlisp.py examples/objects.lsp +;;; Run: python3 lumbda.py examples/objects.lsp ;; Record types with inheritance (define-record-type @@ -42,7 +42,7 @@ ;; Hash table (define ht (make-hash-table)) -(hash-table-set! ht 'name "uncommonlisp") +(hash-table-set! ht 'name "lumbda") (hash-table-set! ht 'version "1.0.0") (hash-table-set! ht 'features '(bytecode continuations macros)) (display "Name: ") (display (hash-table-ref ht 'name)) (newline) diff --git a/examples/portal-http-client.lsp b/examples/portal-http-client.lsp index 1645636..d210afc 100644 --- a/examples/portal-http-client.lsp +++ b/examples/portal-http-client.lsp @@ -7,9 +7,9 @@ ;;; lines of string-munging plus (read-from-string) + (eval). ;;; ;;; Usage (server must be running first — see portal-http-server.lsp): -;;; python3 uncommonlisp.py --fast examples/portal-http-client.lsp -;;; ./c/uncommonlisp examples/portal-http-client.lsp -;;; ./asm/uncommonlisp < examples/portal-http-client.lsp +;;; python3 lumbda.py --fast examples/portal-http-client.lsp +;;; ./c/lumbda examples/portal-http-client.lsp +;;; ./asm/lumbda < examples/portal-http-client.lsp (define *host* "127.0.0.1") (define *port* 9085) diff --git a/examples/portal-http-server.lsp b/examples/portal-http-server.lsp index 9b8cf7b..a9caa72 100644 --- a/examples/portal-http-server.lsp +++ b/examples/portal-http-server.lsp @@ -10,9 +10,9 @@ ;;; sockets, using the language itself as the wire format. ;;; ;;; Runs byte-identically in Python, C, and asm: -;;; python3 uncommonlisp.py --fast examples/portal-http-server.lsp -;;; ./c/uncommonlisp examples/portal-http-server.lsp -;;; ./asm/uncommonlisp < examples/portal-http-server.lsp +;;; python3 lumbda.py --fast examples/portal-http-server.lsp +;;; ./c/lumbda examples/portal-http-server.lsp +;;; ./asm/lumbda < examples/portal-http-server.lsp ;;; ;;; Default port 9085. @@ -53,7 +53,7 @@ (define (portal-body) ;; Produce the S-expression portal as a single string. (string-append - ";; uncommonlisp portable portal\n" + ";; lumbda portable portal\n" "(define counter " (number->string counter) ")\n" "(define my-int " (number->string my-int) ")\n" "(define my-list '(" (list->string my-list) "))\n" @@ -91,7 +91,7 @@ (http-response "200 OK" "application/scheme" (portal-body))) ((string=? path "/") (http-response "200 OK" "text/html" - "portal-http

uncommonlisp portal-http

GET /portal returns the S-expression portal.

")) + "portal-http

lumbda portal-http

GET /portal returns the S-expression portal.

")) (else (http-response "404 Not Found" "text/plain" (string-append "not found: " path "\n")))))) diff --git a/examples/portal-prime.lsp b/examples/portal-prime.lsp index 1eb3bd8..f2baff3 100644 --- a/examples/portal-prime.lsp +++ b/examples/portal-prime.lsp @@ -1,9 +1,9 @@ ;;; portal-prime.lsp — portal a primality test between machines ;;; -;;; Machine A: python3 uncommonlisp.py --fast examples/portal-prime.lsp +;;; Machine A: python3 lumbda.py --fast examples/portal-prime.lsp ;;; (starts computing, saves checkpoint to prime-state.portal) ;;; -;;; Machine B: python3 uncommonlisp.py --portal-resume prime-state.portal +;;; Machine B: python3 lumbda.py --portal-resume prime-state.portal ;;; (resumes from checkpoint, finishes the computation) (define (prime? n) diff --git a/examples/proof-netspace-client.lsp b/examples/proof-netspace-client.lsp index b3974ad..c02d24d 100644 --- a/examples/proof-netspace-client.lsp +++ b/examples/proof-netspace-client.lsp @@ -13,9 +13,9 @@ ;;; until both hold the union of what either knew. ;;; ;;; Usage (start the server first): -;;; python3 uncommonlisp.py --fast examples/proof-netspace-client.lsp -;;; ./c/uncommonlisp examples/proof-netspace-client.lsp -;;; ./asm/uncommonlisp < examples/proof-netspace-client.lsp +;;; python3 lumbda.py --fast examples/proof-netspace-client.lsp +;;; ./c/lumbda examples/proof-netspace-client.lsp +;;; ./asm/lumbda < examples/proof-netspace-client.lsp (define *host* "127.0.0.1") (define *port* 9086) diff --git a/examples/proof-netspace-server.lsp b/examples/proof-netspace-server.lsp index 9e15ee2..58dca33 100644 --- a/examples/proof-netspace-server.lsp +++ b/examples/proof-netspace-server.lsp @@ -12,9 +12,9 @@ ;;; ;;; Portable across Python, C, and asm. Example: ;;; -;;; python3 uncommonlisp.py --fast examples/proof-netspace-server.lsp -;;; ./c/uncommonlisp --fast examples/proof-netspace-server.lsp -;;; ./asm/uncommonlisp < examples/proof-netspace-server.lsp +;;; python3 lumbda.py --fast examples/proof-netspace-server.lsp +;;; ./c/lumbda --fast examples/proof-netspace-server.lsp +;;; ./asm/lumbda < examples/proof-netspace-server.lsp ;;; ;;; For multi-node demos see proof-netspace-node-{a,b}.lsp. diff --git a/examples/repl-server.lsp b/examples/repl-server.lsp index c32a117..c06181e 100644 --- a/examples/repl-server.lsp +++ b/examples/repl-server.lsp @@ -11,9 +11,9 @@ ;;; because both sides already have a reader and an evaluator. ;;; ;;; Usage: -;;; python3 uncommonlisp.py --fast examples/repl-server.lsp -;;; ./c/uncommonlisp examples/repl-server.lsp -;;; ./asm/uncommonlisp < examples/repl-server.lsp +;;; python3 lumbda.py --fast examples/repl-server.lsp +;;; ./c/lumbda examples/repl-server.lsp +;;; ./asm/lumbda < examples/repl-server.lsp ;;; ;;; Then from a client: ;;; (define x 42) ; server mutates its global env diff --git a/examples/rpc-client.lsp b/examples/rpc-client.lsp index 84f0ef6..22cfa37 100644 --- a/examples/rpc-client.lsp +++ b/examples/rpc-client.lsp @@ -5,9 +5,9 @@ ;;; because they agree on S-expression framing. ;;; ;;; Usage: -;;; python3 uncommonlisp.py --fast examples/rpc-client.lsp -;;; ./c/uncommonlisp examples/rpc-client.lsp -;;; ./asm/uncommonlisp < examples/rpc-client.lsp +;;; python3 lumbda.py --fast examples/rpc-client.lsp +;;; ./c/lumbda examples/rpc-client.lsp +;;; ./asm/lumbda < examples/rpc-client.lsp ;;; ;;; Override *target-port* before loading to hit either rpc-server (9080) ;;; or repl-server (9081). diff --git a/examples/rpc-relay.lsp b/examples/rpc-relay.lsp index d856581..4081512 100644 --- a/examples/rpc-relay.lsp +++ b/examples/rpc-relay.lsp @@ -6,9 +6,9 @@ ;;; asm backend, where the same .lsp runs at every hop and the wire ;;; format (Scheme source) needs no translation. ;;; -;;; python3 uncommonlisp.py --fast examples/rpc-relay.lsp -;;; ./c/uncommonlisp examples/rpc-relay.lsp -;;; ./asm/uncommonlisp < examples/rpc-relay.lsp +;;; python3 lumbda.py --fast examples/rpc-relay.lsp +;;; ./c/lumbda examples/rpc-relay.lsp +;;; ./asm/lumbda < examples/rpc-relay.lsp ;;; ;;; Override *listen-port* / *backend-port* by pre-defining before load ;;; (or edit here for a one-off demo). diff --git a/examples/rpc-server.lsp b/examples/rpc-server.lsp index d015f25..33c1ff4 100644 --- a/examples/rpc-server.lsp +++ b/examples/rpc-server.lsp @@ -5,9 +5,9 @@ ;;; the parser on each side is already the right tool. ;;; ;;; Runs byte-identically in Python, C, and asm: -;;; python3 uncommonlisp.py --fast examples/rpc-server.lsp -;;; ./c/uncommonlisp examples/rpc-server.lsp -;;; ./asm/uncommonlisp < examples/rpc-server.lsp +;;; python3 lumbda.py --fast examples/rpc-server.lsp +;;; ./c/lumbda examples/rpc-server.lsp +;;; ./asm/lumbda < examples/rpc-server.lsp ;;; ;;; Request examples (send as plain text, one per connection): ;;; (ping) -> pong diff --git a/examples/spiral-client.lsp b/examples/spiral-client.lsp index 99e9a10..6ecf38d 100644 --- a/examples/spiral-client.lsp +++ b/examples/spiral-client.lsp @@ -12,7 +12,7 @@ ;;; direction. N nodes in a mesh converge after N-1 spiral passes. ;;; ;;; Usage (start both nodes first): -;;; python3 uncommonlisp.py --fast examples/spiral-client.lsp +;;; python3 lumbda.py --fast examples/spiral-client.lsp (define *host* "127.0.0.1") (define *port-a* 9086) diff --git a/examples/spiral-demo.sh b/examples/spiral-demo.sh index 591ebc3..e7a6980 100755 --- a/examples/spiral-demo.sh +++ b/examples/spiral-demo.sh @@ -19,9 +19,9 @@ trap 'pkill -9 -u "$USER" -f "proof-netspace-node|spiral-client" 2>/dev/null || IMPL="${1:-python}" case "$IMPL" in - python) BIN="python3 uncommonlisp.py --fast" ;; - c) BIN="./c/uncommonlisp --fast" ;; - asm) BIN="asm/uncommonlisp" ;; + python) BIN="python3 lumbda.py --fast" ;; + c) BIN="./c/lumbda --fast" ;; + asm) BIN="asm/lumbda" ;; *) echo "unknown impl: $IMPL (expected python|c|asm)"; exit 1 ;; esac diff --git a/friction.sh b/friction.sh index b4f9f93..773a85b 100644 --- a/friction.sh +++ b/friction.sh @@ -1,5 +1,5 @@ #!/bin/bash -# friction.sh — Head-to-head benchmark: CPython vs uncommonlisp-Python vs uncommonlisp-C +# friction.sh — Head-to-head benchmark: CPython vs lumbda-Python vs lumbda-C # # Usage: bash friction.sh @@ -7,7 +7,7 @@ set -e cd "$(dirname "$0")" echo "═══════════════════════════════════════════════════════════════" -echo "Friction Benchmark: CPython vs uncommonlisp-Python vs uncommonlisp-C" +echo "Friction Benchmark: CPython vs lumbda-Python vs lumbda-C" echo "═══════════════════════════════════════════════════════════════" echo @@ -27,9 +27,9 @@ def fib(n): t=time.perf_counter(); r=fib(35); print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-Python: " +printf " lumbda-Python: " python3 -c " -import time; from uncommonlisp import * +import time; from lumbda import * g=make_global_env(); [leval(e,g) for e in read_all(PRELUDE)] [leval(e,g) for e in read_all('(auto-compile! #t)')] [leval(e,g) for e in read_all('(define (fib n) (let loop ((a 0) (b 1) (i 0)) (if (= i n) a (loop b (+ a b) (+ i 1)))))')] @@ -37,8 +37,8 @@ t=time.perf_counter(); r=[leval(e,g) for e in read_all('(fib 35)')][-1] print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-C: " -/usr/bin/time -f "%e s" ./c/uncommonlisp -e '(define (fib n) (let loop ((a 0) (b 1) (i 0)) (if (= i n) a (loop b (+ a b) (+ i 1))))) (display (fib 35)) (newline)' 2>&1 +printf " lumbda-C: " +/usr/bin/time -f "%e s" ./c/lumbda -e '(define (fib n) (let loop ((a 0) (b 1) (i 0)) (if (= i n) a (loop b (+ a b) (+ i 1))))) (display (fib 35)) (newline)' 2>&1 echo @@ -54,9 +54,9 @@ def fib(n): t=time.perf_counter(); r=fib(20); print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-Python: " +printf " lumbda-Python: " python3 -c " -import time,sys; sys.setrecursionlimit(50000); from uncommonlisp import * +import time,sys; sys.setrecursionlimit(50000); from lumbda import * g=make_global_env(); [leval(e,g) for e in read_all(PRELUDE)] [leval(e,g) for e in read_all('(auto-compile! #t)')] [leval(e,g) for e in read_all('(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))')] @@ -64,8 +64,8 @@ t=time.perf_counter(); r=[leval(e,g) for e in read_all('(fib 20)')][-1] print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-C: " -/usr/bin/time -f "%e s" ./c/uncommonlisp -e '(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) (display (fib 20)) (newline)' 2>&1 +printf " lumbda-C: " +/usr/bin/time -f "%e s" ./c/lumbda -e '(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) (display (fib 20)) (newline)' 2>&1 echo @@ -82,9 +82,9 @@ def ack(m,n): t=time.perf_counter(); r=ack(3,4); print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-Python: " +printf " lumbda-Python: " python3 -c " -import time,sys; sys.setrecursionlimit(50000); from uncommonlisp import * +import time,sys; sys.setrecursionlimit(50000); from lumbda import * g=make_global_env(); [leval(e,g) for e in read_all(PRELUDE)] [leval(e,g) for e in read_all('(auto-compile! #t)')] [leval(e,g) for e in read_all('(define (ack m n) (cond ((= m 0) (+ n 1)) ((= n 0) (ack (- m 1) 1)) (else (ack (- m 1) (ack m (- n 1))))))')] @@ -92,8 +92,8 @@ t=time.perf_counter(); r=[leval(e,g) for e in read_all('(ack 3 4)')][-1] print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-C: " -/usr/bin/time -f "%e s" ./c/uncommonlisp -e '(define (ack m n) (cond ((= m 0) (+ n 1)) ((= n 0) (ack (- m 1) 1)) (else (ack (- m 1) (ack m (- n 1)))))) (display (ack 3 4)) (newline)' 2>&1 +printf " lumbda-C: " +/usr/bin/time -f "%e s" ./c/lumbda -e '(define (ack m n) (cond ((= m 0) (+ n 1)) ((= n 0) (ack (- m 1) 1)) (else (ack (- m 1) (ack m (- n 1)))))) (display (ack 3 4)) (newline)' 2>&1 echo @@ -110,9 +110,9 @@ def s(n): t=time.perf_counter(); r=s(50000); print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-Python: " +printf " lumbda-Python: " python3 -c " -import time; from uncommonlisp import * +import time; from lumbda import * g=make_global_env(); [leval(e,g) for e in read_all(PRELUDE)] [leval(e,g) for e in read_all('(auto-compile! #t)')] [leval(e,g) for e in read_all('(define (sum-to n) (let loop ((i n) (acc 0)) (if (= i 0) acc (loop (- i 1) (+ acc i)))))')] @@ -120,8 +120,8 @@ t=time.perf_counter(); r=[leval(e,g) for e in read_all('(sum-to 50000)')][-1] print(f'{(time.perf_counter()-t)*1000:.3f}ms result={r}') " -printf " uncommonlisp-C: " -/usr/bin/time -f "%e s" ./c/uncommonlisp -e '(define (sum-to n) (let loop ((i n) (acc 0)) (if (= i 0) acc (loop (- i 1) (+ acc i))))) (display (sum-to 50000)) (newline)' 2>&1 +printf " lumbda-C: " +/usr/bin/time -f "%e s" ./c/lumbda -e '(define (sum-to n) (let loop ((i n) (acc 0)) (if (= i 0) acc (loop (- i 1) (+ acc i))))) (display (sum-to 50000)) (newline)' 2>&1 echo echo "═══════════════════════════════════════════════════════════════" diff --git a/uncommonlisp.py b/lumbda.py similarity index 99% rename from uncommonlisp.py rename to lumbda.py index c59fd5c..6cfdce1 100644 --- a/uncommonlisp.py +++ b/lumbda.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 """ -uncommonlisp — a Lisp in one Python file. -Usage: python3 uncommonlisp.py [script.lsp] # run a file - python3 uncommonlisp.py # interactive REPL - python3 uncommonlisp.py -e '(+ 1 2)' # eval expression +lumbda — a Lisp in one Python file. +Usage: python3 lumbda.py [script.lsp] # run a file + python3 lumbda.py # interactive REPL + python3 lumbda.py -e '(+ 1 2)' # eval expression """ import sys, re, math, itertools, os as _os from fractions import Fraction @@ -2217,7 +2217,7 @@ def portal_save(env, path, continuation=None): """Save machine state to a .portal file.""" ser = _PortalSerializer() state = { - 'format': 'uncommonlisp-portal-v1', + 'format': 'lumbda-portal-v1', 'env': ser.serialize_env(env), 'continuation': ser.serialize_continuation(continuation) if continuation else None, 'auto_compile': _auto_compile[0], @@ -2231,7 +2231,7 @@ def portal_resume(path, base_env=None): """Resume machine state from a .portal file. Returns (env, continuation_or_None).""" with open(path) as f: state = _json.load(f) - if state.get('format') != 'uncommonlisp-portal-v1': + if state.get('format') != 'lumbda-portal-v1': raise LispErr(f'portal: unsupported format: {state.get("format")}') if base_env is None: base_env = make_global_env() @@ -3488,7 +3488,7 @@ def make_global_env(): d(S('else'), True) d(S('...'), S('...')) d(S('*version*'), '1.0.0') - d(S('*name*'), 'uncommonlisp') + d(S('*name*'), 'lumbda') return g @@ -3621,7 +3621,7 @@ PRELUDE = r""" def repl(env, prompt='λ> ', quiet=False): if not quiet: - print(f'uncommonlisp {env.lookup(S("*version*"))} ' + print(f'lumbda {env.lookup(S("*version*"))} ' f'— (exit) to quit, (load "file.lsp") to load') buf = '' while True: @@ -3674,11 +3674,11 @@ def main(): # --help / -h if '--help' in args or '-h' in args: - print('''uncommonlisp — a Scheme in one Python file + print('''lumbda — a Scheme in one Python file -Usage: uncommonlisp [options] [script.lsp] [args...] - uncommonlisp -e '(+ 1 2)' - uncommonlisp (interactive REPL) +Usage: lumbda [options] [script.lsp] [args...] + lumbda -e '(+ 1 2)' + lumbda (interactive REPL) Options: -e EXPR evaluate expression and print result @@ -3692,7 +3692,7 @@ Features: R7RS core, bytecode compiler, full continuations, macros, # --version / -v if '--version' in args or '-v' in args: - print(f'uncommonlisp 1.0.0'); return + print(f'lumbda 1.0.0'); return # --fast / -f: enable auto-compile if '--fast' in args or '-f' in args: @@ -3703,7 +3703,7 @@ Features: R7RS core, bytecode compiler, full continuations, macros, if '--compile' in args: args = [a for a in args if a != '--compile'] if not args: - print('usage: uncommonlisp --compile file.lsp', file=sys.stderr); sys.exit(1) + print('usage: lumbda --compile file.lsp', file=sys.stderr); sys.exit(1) path = args[0]; out = path.rsplit('.', 1)[0] + '.lspc' _auto_compile[0] = True _load(path, g) @@ -3721,7 +3721,7 @@ Features: R7RS core, bytecode compiler, full continuations, macros, if '--portal-resume' in args: args = [a for a in args if a != '--portal-resume'] if not args: - print('usage: uncommonlisp --portal-resume state.portal', file=sys.stderr); sys.exit(1) + print('usage: lumbda --portal-resume state.portal', file=sys.stderr); sys.exit(1) path = args[0] env, cont = portal_resume(path, g) if cont is not None: @@ -3739,7 +3739,7 @@ Features: R7RS core, bytecode compiler, full continuations, macros, # -e 'expr' mode if args and args[0] == '-e': if len(args) < 2: - print('usage: uncommonlisp -e ', file=sys.stderr) + print('usage: lumbda -e ', file=sys.stderr) sys.exit(1) for expr in read_all(args[1]): result = leval(expr, g) diff --git a/proof/benchmark.sh b/proof/benchmark.sh index b666e4e..0a5ca47 100644 --- a/proof/benchmark.sh +++ b/proof/benchmark.sh @@ -1,10 +1,10 @@ #!/bin/bash -# benchmark.sh — Run EML proof in both Python and uncommonlisp, compare times +# benchmark.sh — Run EML proof in both Python and lumbda, compare times # # Usage: cd proof && bash benchmark.sh echo "═══════════════════════════════════════════════════════════════" -echo "EML Universality Proof — Benchmark: Python vs uncommonlisp" +echo "EML Universality Proof — Benchmark: Python vs lumbda" echo "═══════════════════════════════════════════════════════════════" echo @@ -13,9 +13,9 @@ echo "---" time python3 eml_proof.py echo -echo ">>> uncommonlisp implementation (--fast = bytecode compiled)" +echo ">>> lumbda implementation (--fast = bytecode compiled)" echo "---" -time python3 ../uncommonlisp.py --fast eml_proof.lsp +time python3 ../lumbda.py --fast eml_proof.lsp echo echo "═══════════════════════════════════════════════════════════════" diff --git a/proof/benchmark_results.md b/proof/benchmark_results.md index 46d8537..46506cf 100644 --- a/proof/benchmark_results.md +++ b/proof/benchmark_results.md @@ -8,7 +8,7 @@ with constant 1 generates all elementary functions (arXiv:2603.21852v2). | Approach | Time | Guarantee | Friction | |----------|------|-----------|----------| | Python (numerical) | 0.04s | 1e-10 tolerance | Low | -| uncommonlisp (numerical) | 59s | 1e-10 tolerance | High | +| lumbda (numerical) | 59s | 1e-10 tolerance | High | | Lean 4 (formal proof) | 1.5s | kernel-verified | Medium | ## Analysis @@ -16,7 +16,7 @@ with constant 1 generates all elementary functions (arXiv:2603.21852v2). **The formal proof is 40x faster than brute-force search and provides mathematical certainty instead of floating-point tolerance.** -The numerical approaches (Python and uncommonlisp) perform O(N²) pairwise +The numerical approaches (Python and lumbda) perform O(N²) pairwise enumeration of EML trees, evaluating at transcendental test points and comparing against target functions. This is MOAD-0001 at the proof layer: quadratic search friction where algebraic reasoning suffices. diff --git a/proof/eml_proof.lsp b/proof/eml_proof.lsp index 540e95b..7c7bff9 100644 --- a/proof/eml_proof.lsp +++ b/proof/eml_proof.lsp @@ -1,9 +1,9 @@ -;;; eml_proof.lsp — Verify EML universality in uncommonlisp +;;; eml_proof.lsp — Verify EML universality in lumbda ;;; ;;; eml(x, y) = exp(x) - ln(y) generates all elementary functions. ;;; Reference: "All elementary functions from a single operator" (arXiv:2603.21852v2) ;;; -;;; Run: python3 uncommonlisp.py --fast proof/eml_proof.lsp +;;; Run: python3 lumbda.py --fast proof/eml_proof.lsp ;;; ═══════════════════════════════════════════════════════════════════ ;;; EML operator and test infrastructure @@ -35,7 +35,7 @@ (define gamma 0.5772156649015329) (define apery 1.2020569031595943) -(display "EML Universality Proof — uncommonlisp") (newline) +(display "EML Universality Proof — lumbda") (newline) (display "eml(x, y) = exp(x) - ln(y)") (newline) (display "======================================================================") (newline) @@ -118,7 +118,7 @@ (display "----------------------------------------------------------------------") (newline) (display " Key insight: ln(negative) = ln(|neg|) + iπ") (newline) (display " From -1, ln(-1) = iπ, giving access to complex plane.") (newline) -(display " uncommonlisp uses real arithmetic; verifying the chain:") (newline) +(display " lumbda uses real arithmetic; verifying the chain:") (newline) (newline) ;; Verify the real-arithmetic building blocks that WOULD give complex access: diff --git a/proof/eml_proof_in_lumbda.lsp b/proof/eml_proof_in_lumbda.lsp index 643d4bf..0513cc5 100644 --- a/proof/eml_proof_in_lumbda.lsp +++ b/proof/eml_proof_in_lumbda.lsp @@ -12,9 +12,9 @@ ;;; that checks it live in the same file. ;;; ;;; Runs byte-identically in Python, C, and asm: -;;; python3 uncommonlisp.py --fast proof/eml_proof_in_lumbda.lsp -;;; ./c/uncommonlisp proof/eml_proof_in_lumbda.lsp -;;; ./asm/uncommonlisp < proof/eml_proof_in_lumbda.lsp +;;; python3 lumbda.py --fast proof/eml_proof_in_lumbda.lsp +;;; ./c/lumbda proof/eml_proof_in_lumbda.lsp +;;; ./asm/lumbda < proof/eml_proof_in_lumbda.lsp ;;; ═══════════════════════════════════════════════════════════════ ;;; Term-rewriting engine diff --git a/stdlib.lsp b/stdlib.lsp index 74e6ef7..16c3197 100644 --- a/stdlib.lsp +++ b/stdlib.lsp @@ -1,6 +1,6 @@ -;;; stdlib.lsp — standard library for uncommonlisp +;;; stdlib.lsp — standard library for lumbda ;;; Load with: (load "stdlib.lsp") -;;; Automatically loaded by the interpreter if found next to uncommonlisp.py. +;;; Automatically loaded by the interpreter if found next to lumbda.py. ;;;; ── Syntax-rules versions of core macros ──────────────────────────────── diff --git a/tests.py b/tests.py index 07ebe69..eff79a4 100644 --- a/tests.py +++ b/tests.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -tests.py — unit, integration, and functional tests for uncommonlisp. +tests.py — unit, integration, and functional tests for lumbda. Run: python3 tests.py [-v] """ @@ -8,7 +8,7 @@ import sys, io, unittest, math, textwrap sys.setrecursionlimit(200) # intentionally low — proves TCO works # ── import the interpreter ──────────────────────────────────────────────────── -from uncommonlisp import ( +from lumbda import ( Symbol, S, NIL, Pair, Proc, Macro, VOID, EOF, LispErr, show, _tokenize, _tokenize_lines, read_all, _L, _P, _truthy, _formals, _equal, Env, _qq, leval, _call, make_global_env, PRELUDE, @@ -67,7 +67,7 @@ class TestSymbol(unittest.TestCase): class TestNil(unittest.TestCase): def test_singleton(self): - from uncommonlisp import _Nil + from lumbda import _Nil assert _Nil() is NIL def test_falsy(self): @@ -1509,7 +1509,7 @@ class TestCommandLine(unittest.TestCase): def _run(self, *args, input_text=None): import subprocess result = subprocess.run( - [sys.executable, 'uncommonlisp.py'] + list(args), + [sys.executable, 'lumbda.py'] + list(args), capture_output=True, text=True, input=input_text, cwd='/home/fox/git/uncommonlisp' ) @@ -1670,7 +1670,7 @@ class TestStringPorts(unittest.TestCase): def test_open_input_string_eof(self): r = run('(let ((p (open-input-string ""))) (read p))', self.g) - from uncommonlisp import EOF + from lumbda import EOF assert r is EOF def test_open_input_string_read_char(self): @@ -1728,7 +1728,7 @@ class TestErrorObjects(unittest.TestCase): def test_error_object_irritants_empty(self): r = run('(guard (e (#t (error-object-irritants e))) (error "no-irritants"))', self.g) - from uncommonlisp import NIL + from lumbda import NIL assert r is NIL def test_with_exception_handler_gets_error_object(self): @@ -2717,7 +2717,7 @@ class TestSourceMaps(unittest.TestCase): f.write('(define x 1)\n(define y 2)\n(+ x y)') path = f.name try: - from uncommonlisp import _load + from lumbda import _load env = fresh() _load(path, env) assert env.lookup(S('x')) == 1 @@ -3029,7 +3029,7 @@ class TestBytecodeSerialization(unittest.TestCase): lspc = path.rsplit('.', 1)[0] + '.lspc' try: result = subprocess.run( - ['python3', 'uncommonlisp.py', '--compile', path], + ['python3', 'lumbda.py', '--compile', path], capture_output=True, text=True, timeout=30) assert result.returncode == 0 assert os.path.exists(lspc) @@ -3177,7 +3177,7 @@ class TestPortal(unittest.TestCase): try: portal_save(self.g, path) result = subprocess.run( - ['python3', 'uncommonlisp.py', '--portal-resume', path, + ['python3', 'lumbda.py', '--portal-resume', path, '-e', '(display answer)'], capture_output=True, text=True, timeout=30) # portal-resume loads state, then -e isn't processed (portal-resume returns) @@ -3195,7 +3195,7 @@ class TestPortal(unittest.TestCase): portal_save(self.g, path) with open(path) as f: data = json.load(f) - assert data['format'] == 'uncommonlisp-portal-v1' + assert data['format'] == 'lumbda-portal-v1' assert 'objects' in data assert 'env' in data finally: diff --git a/tests/bench-3way.sh b/tests/bench-3way.sh index ec2d4aa..1b0b281 100755 --- a/tests/bench-3way.sh +++ b/tests/bench-3way.sh @@ -60,15 +60,15 @@ best_of_two() { } echo "── Python (--fast) ──" -best_of_two "python3 uncommonlisp.py --fast /tmp/bench-3way.lsp" +best_of_two "python3 lumbda.py --fast /tmp/bench-3way.lsp" echo echo "── C (--fast) ──" -best_of_two "c/uncommonlisp --fast /tmp/bench-3way.lsp" +best_of_two "c/lumbda --fast /tmp/bench-3way.lsp" echo echo "── asm ──" -best_of_two "asm/uncommonlisp < /tmp/bench-3way.lsp" +best_of_two "asm/lumbda < /tmp/bench-3way.lsp" echo rm -f /tmp/bench-3way.lsp diff --git a/tests/bench-gc-adaptive.sh b/tests/bench-gc-adaptive.sh index 0667689..5cf0354 100755 --- a/tests/bench-gc-adaptive.sh +++ b/tests/bench-gc-adaptive.sh @@ -6,7 +6,7 @@ set -e cd "$(dirname "$0")/.." ulimit -v 524288 -trap 'pkill -9 -u "$USER" -f "asm/uncommonlisp" 2>/dev/null || true' EXIT +trap 'pkill -9 -u "$USER" -f "asm/lumbda" 2>/dev/null || true' EXIT make -s -C asm all @@ -20,7 +20,7 @@ run_phase() { echo "(define *workload* $workload)" echo "(define *mode* $mode)" cat examples/bench-gc-adaptive.lsp - } | timeout 60 ./asm/uncommonlisp-gc + } | timeout 60 ./asm/lumbda-gc echo "" } @@ -31,7 +31,7 @@ run_phase "hostile" 1 1 "adaptive" run_phase "mixed" 2 0 "greedy" run_phase "mixed" 2 1 "adaptive" -if pgrep -u "$USER" -f 'asm/uncommonlisp' > /dev/null; then +if pgrep -u "$USER" -f 'asm/lumbda' > /dev/null; then echo "STRAGGLER" >&2 exit 1 fi diff --git a/tests/bench-gc-arena.sh b/tests/bench-gc-arena.sh index 7df86d6..492e34a 100755 --- a/tests/bench-gc-arena.sh +++ b/tests/bench-gc-arena.sh @@ -7,12 +7,12 @@ set -e cd "$(dirname "$0")/.." ulimit -v 524288 -trap 'pkill -9 -u "$USER" -f "asm/uncommonlisp" 2>/dev/null || true' EXIT +trap 'pkill -9 -u "$USER" -f "asm/lumbda" 2>/dev/null || true' EXIT make -s -C asm all echo "== asm (naive GC, with arena as meta fast path) ==" -./asm/uncommonlisp-gc < examples/bench-gc-arena.lsp & +./asm/lumbda-gc < examples/bench-gc-arena.lsp & pid=$! peak=0 while kill -0 "$pid" 2>/dev/null; do @@ -24,7 +24,7 @@ wait "$pid" || true echo "" echo "peak_rss_kb=$peak" -if pgrep -u "$USER" -f 'asm/uncommonlisp' > /dev/null; then +if pgrep -u "$USER" -f 'asm/lumbda' > /dev/null; then echo "STRAGGLER" >&2 exit 1 fi diff --git a/tests/bench-gc-http.sh b/tests/bench-gc-http.sh index 5e54a1c..b0a46d5 100755 --- a/tests/bench-gc-http.sh +++ b/tests/bench-gc-http.sh @@ -96,9 +96,9 @@ run_case() { # to completion rather than OOM'd. VCAP=${VCAP:-524288} -run_case "asm no-GC + snapshot loop" "./asm/uncommonlisp" "examples/http-server.lsp" "$VCAP" || true -run_case "asm GC + snapshot loop" "./asm/uncommonlisp-gc" "examples/http-server.lsp" "$VCAP" || true -run_case "asm no-GC + no snapshot" "./asm/uncommonlisp" "examples/http-server-noarena.lsp" "$VCAP" || true -run_case "asm GC + no snapshot" "./asm/uncommonlisp-gc" "examples/http-server-noarena.lsp" "$VCAP" || true +run_case "asm no-GC + snapshot loop" "./asm/lumbda" "examples/http-server.lsp" "$VCAP" || true +run_case "asm GC + snapshot loop" "./asm/lumbda-gc" "examples/http-server.lsp" "$VCAP" || true +run_case "asm no-GC + no snapshot" "./asm/lumbda" "examples/http-server-noarena.lsp" "$VCAP" || true +run_case "asm GC + no snapshot" "./asm/lumbda-gc" "examples/http-server-noarena.lsp" "$VCAP" || true printf "\n" diff --git a/tests/bench-gc-memory.sh b/tests/bench-gc-memory.sh index 97dac03..c8bf059 100755 --- a/tests/bench-gc-memory.sh +++ b/tests/bench-gc-memory.sh @@ -7,7 +7,7 @@ set -e cd "$(dirname "$0")/.." ulimit -v 524288 -trap 'pkill -9 -u "$USER" -f "asm/uncommonlisp" 2>/dev/null || true' EXIT +trap 'pkill -9 -u "$USER" -f "asm/lumbda" 2>/dev/null || true' EXIT make -s -C asm all @@ -35,12 +35,12 @@ run_with_sampling() { echo "" } -run_with_sampling ./asm/uncommonlisp "asm (no GC, 64 MB chunks)" -run_with_sampling ./asm/uncommonlisp-gc "asm (naive GC, 1 MB chunks)" +run_with_sampling ./asm/lumbda "asm (no GC, 64 MB chunks)" +run_with_sampling ./asm/lumbda-gc "asm (naive GC, 1 MB chunks)" rm -f /tmp/gc-bench.out -if pgrep -u "$USER" -f 'asm/uncommonlisp' > /dev/null; then +if pgrep -u "$USER" -f 'asm/lumbda' > /dev/null; then echo "STRAGGLER detected" >&2 exit 1 fi diff --git a/tests/bench-hashset.sh b/tests/bench-hashset.sh index d849cb7..fd2bbc9 100755 --- a/tests/bench-hashset.sh +++ b/tests/bench-hashset.sh @@ -5,26 +5,26 @@ set +e cd "$(dirname "$0")/.." ulimit -v 524288 -trap 'pkill -9 -u "$USER" -f "asm/uncommonlisp" 2>/dev/null || true' EXIT +trap 'pkill -9 -u "$USER" -f "asm/lumbda" 2>/dev/null || true' EXIT # Build if needed -if [ ! -x asm/uncommonlisp ] || [ asm/uncommonlisp.s -nt asm/uncommonlisp ]; then +if [ ! -x asm/lumbda ] || [ asm/lumbda.s -nt asm/lumbda ]; then make -s asm-build fi echo "── asm no-GC ──" -timeout 60 ./asm/uncommonlisp < examples/bench-hashset.lsp +timeout 60 ./asm/lumbda < examples/bench-hashset.lsp echo "" echo "── asm GC (GC_NAIVE build) ──" # Under GC_NAIVE the heap is 1 MB per chunk; build-list(K=500) runs # into the bump threshold and triggers implicit GC. That's the # intended comparison — same primitives, different allocator. -timeout 60 ./asm/uncommonlisp-gc < examples/bench-hashset.lsp +timeout 60 ./asm/lumbda-gc < examples/bench-hashset.lsp # Verify cleanup. pgrep with -x matches the exact command basename # so it doesn't false-positive on the parent shell. -if pgrep -u "$USER" -x uncommonlisp > /dev/null || \ - pgrep -u "$USER" -x uncommonlisp-gc > /dev/null; then +if pgrep -u "$USER" -x lumbda > /dev/null || \ + pgrep -u "$USER" -x lumbda-gc > /dev/null; then echo "STRAGGLER asm binary detected" >&2 exit 1 fi diff --git a/tests/bench-proof.sh b/tests/bench-proof.sh index ab09044..987e518 100755 --- a/tests/bench-proof.sh +++ b/tests/bench-proof.sh @@ -52,17 +52,17 @@ echo "════════════════════════ printf " %-38s %s\n" "Lumbda tier" "cold cached" printf " %-38s %s\n" "─────────────────────────────────────" "───────────────" printf " %-38s %4s ms %4s ms\n" "Python --fast" \ - "$(bestof_cold 'python3 uncommonlisp.py --fast proof/eml_proof_in_lumbda.lsp')" \ - "$(bestof_cached 'python3 uncommonlisp.py --fast proof/eml_proof_in_lumbda.lsp')" + "$(bestof_cold 'python3 lumbda.py --fast proof/eml_proof_in_lumbda.lsp')" \ + "$(bestof_cached 'python3 lumbda.py --fast proof/eml_proof_in_lumbda.lsp')" printf " %-38s %4s ms %4s ms\n" "C (tree-walker)" \ - "$(bestof_cold 'c/uncommonlisp proof/eml_proof_in_lumbda.lsp')" \ - "$(bestof_cached 'c/uncommonlisp proof/eml_proof_in_lumbda.lsp')" + "$(bestof_cold 'c/lumbda proof/eml_proof_in_lumbda.lsp')" \ + "$(bestof_cached 'c/lumbda proof/eml_proof_in_lumbda.lsp')" printf " %-38s %4s ms %4s ms\n" "C --fast (bytecode VM)" \ - "$(bestof_cold 'timeout 15 c/uncommonlisp --fast proof/eml_proof_in_lumbda.lsp')" \ - "$(bestof_cached 'timeout 15 c/uncommonlisp --fast proof/eml_proof_in_lumbda.lsp')" + "$(bestof_cold 'timeout 15 c/lumbda --fast proof/eml_proof_in_lumbda.lsp')" \ + "$(bestof_cached 'timeout 15 c/lumbda --fast proof/eml_proof_in_lumbda.lsp')" printf " %-38s %4s ms %4s ms\n" "asm" \ - "$(bestof_cold 'asm/uncommonlisp < proof/eml_proof_in_lumbda.lsp')" \ - "$(bestof_cached 'asm/uncommonlisp < proof/eml_proof_in_lumbda.lsp')" + "$(bestof_cold 'asm/lumbda < proof/eml_proof_in_lumbda.lsp')" \ + "$(bestof_cached 'asm/lumbda < proof/eml_proof_in_lumbda.lsp')" echo "" echo " Lean 4 comparison:" diff --git a/tests/functional.lsp b/tests/functional.lsp index 3d3621d..34ac7da 100644 --- a/tests/functional.lsp +++ b/tests/functional.lsp @@ -1,8 +1,8 @@ ;;; functional.lsp — Shared functional test suite ;;; Runs identically in both Python and C implementations. ;;; -;;; Python: python3 uncommonlisp.py --fast tests/functional.lsp -;;; C: ./c/uncommonlisp tests/functional.lsp +;;; Python: python3 lumbda.py --fast tests/functional.lsp +;;; C: ./c/lumbda tests/functional.lsp ;;; ;;; Output: lines of "PASS: name" or "FAIL: name got=X expected=Y" ;;; Exit: displays summary at end @@ -595,11 +595,11 @@ ;;; File I/O: write-file / file->string round-trip ;;; ═══════════════════════════════════════════════════════════════ -(define *tmp-path* "/tmp/uncommonlisp-functional-fio.txt") +(define *tmp-path* "/tmp/lumbda-functional-fio.txt") (assert-true "write-file basic" (write-file *tmp-path* "hello\n")) (assert-equal "file->string round-trip" (file->string *tmp-path*) "hello\n") -(assert-false "file->string missing" (file->string "/tmp/__nope_uncommonlisp_fio__")) +(assert-false "file->string missing" (file->string "/tmp/__nope_lumbda_fio__")) (assert-true "write-file overwrite" (begin (write-file *tmp-path* "second") (string=? (file->string *tmp-path*) "second"))) @@ -608,7 +608,7 @@ ;;; Cross-impl state exchange using only string primitives ;;; ═══════════════════════════════════════════════════════════════ -(define *portal-path* "/tmp/uncommonlisp-functional-portal.sexp") +(define *portal-path* "/tmp/lumbda-functional-portal.sexp") (write-file *portal-path* "(define portal-x 111)\n(define portal-y 222)\n(define portal-z 333)\n") diff --git a/tests/portal-benchmark.sh b/tests/portal-benchmark.sh index a7fa816..1534d41 100755 --- a/tests/portal-benchmark.sh +++ b/tests/portal-benchmark.sh @@ -11,9 +11,9 @@ set -u cd "$(dirname "$0")/.." -PY="python3 uncommonlisp.py --fast" -C="./c/uncommonlisp" -ASM="./asm/uncommonlisp" +PY="python3 lumbda.py --fast" +C="./c/lumbda" +ASM="./asm/lumbda" N=50 pad() { printf " %-42s " "$1"; } diff --git a/tests/portal-cross-test.sh b/tests/portal-cross-test.sh index 7c08587..a982dda 100755 --- a/tests/portal-cross-test.sh +++ b/tests/portal-cross-test.sh @@ -13,9 +13,9 @@ set -e cd "$(dirname "$0")/.." -PY="python3 uncommonlisp.py --fast" -C="./c/uncommonlisp" -ASM="./asm/uncommonlisp" +PY="python3 lumbda.py --fast" +C="./c/lumbda" +ASM="./asm/lumbda" SEXP=/tmp/portal-xtest.sexp PASS=0 diff --git a/tests/portal-exchange.lsp b/tests/portal-exchange.lsp index 78bb0fd..cc43cbb 100644 --- a/tests/portal-exchange.lsp +++ b/tests/portal-exchange.lsp @@ -16,7 +16,7 @@ ;; Write all user-defined bindings as (define name value) forms ;; that any Scheme can evaluate to restore state (let ((port (open-output-file filename))) - (display ";; uncommonlisp portable state" port) + (display ";; lumbda portable state" port) (newline port) (display ";; generated by portal-save-sexp" port) (newline port) diff --git a/tests/portal-formats.lsp b/tests/portal-formats.lsp index 611b11d..11e0b7d 100644 --- a/tests/portal-formats.lsp +++ b/tests/portal-formats.lsp @@ -4,9 +4,9 @@ ;;; 2. JSON (Python + C) ;;; 3. Binary heap dump (assembly only, fastest) ;;; -;;; Run in Python: python3 uncommonlisp.py --fast tests/portal-formats.lsp -;;; Run in C: ./c/uncommonlisp tests/portal-formats.lsp -;;; Asm: asm/uncommonlisp < tests/portal-cross-load.lsp (no `load` builtin) +;;; Run in Python: python3 lumbda.py --fast tests/portal-formats.lsp +;;; Run in C: ./c/lumbda tests/portal-formats.lsp +;;; Asm: asm/lumbda < tests/portal-cross-load.lsp (no `load` builtin) ;;; ;;; ── Observed results (2026-04-16, same laptop) ───────────────── ;;; @@ -47,7 +47,7 @@ (define (write-sexp-portal filename) (let ((port (open-output-file filename))) ;; Header - (display ";; uncommonlisp portable state (S-expression format)" port) + (display ";; lumbda portable state (S-expression format)" port) (newline port) (display ";; resume: (load \"" port) (display filename port) diff --git a/tests/rpc-chain-bench.sh b/tests/rpc-chain-bench.sh index f39fbfe..ff081d3 100755 --- a/tests/rpc-chain-bench.sh +++ b/tests/rpc-chain-bench.sh @@ -24,7 +24,7 @@ SPAWNED=() cleanup() { for pid in "${SPAWNED[@]}"; do kill -9 "$pid" 2>/dev/null; done sleep 0.2 - pkill -9 -u "$USER" -f 'uncommonlisp.*(rpc|repl)-(server|relay|chain-bench)\.lsp' 2>/dev/null || true + pkill -9 -u "$USER" -f 'lumbda.*(rpc|repl)-(server|relay|chain-bench)\.lsp' 2>/dev/null || true } trap cleanup EXIT INT TERM @@ -61,17 +61,17 @@ stop_bg() { verify_clean() { local strays - strays=$(pgrep -u "$USER" -f 'uncommonlisp.*(rpc|repl)-(server|relay|chain-bench)\.lsp' 2>/dev/null || true) + strays=$(pgrep -u "$USER" -f 'lumbda.*(rpc|repl)-(server|relay|chain-bench)\.lsp' 2>/dev/null || true) if [ -n "$strays" ]; then echo "!! STRAYS: $strays" >&2 - pkill -9 -u "$USER" -f 'uncommonlisp.*(rpc|repl)-(server|relay|chain-bench)\.lsp' 2>/dev/null || true + pkill -9 -u "$USER" -f 'lumbda.*(rpc|repl)-(server|relay|chain-bench)\.lsp' 2>/dev/null || true return 1 fi } -PY="python3 uncommonlisp.py --fast" -C="./c/uncommonlisp" -ASM="./asm/uncommonlisp" +PY="python3 lumbda.py --fast" +C="./c/lumbda" +ASM="./asm/lumbda" # Always use Python client to drive (identical across benches). # We sed the hardcoded port in-place because asm's top-level diff --git a/tests/web-benchmark.sh b/tests/web-benchmark.sh index daa33ae..3d7705a 100755 --- a/tests/web-benchmark.sh +++ b/tests/web-benchmark.sh @@ -1,5 +1,5 @@ #!/bin/bash -# web-benchmark.sh — race the three uncommonlisp HTTP servers +# web-benchmark.sh — race the three lumbda HTTP servers # against Python http.server and busybox httpd. # # No wrk/ab/nginx dependency — we use xargs+curl for concurrency. @@ -12,10 +12,10 @@ cd "$(dirname "$0")/.." REQUESTS=${REQUESTS:-500} CONCURRENCY=${CONCURRENCY:-10} -PY="python3 uncommonlisp.py --fast" -C="./c/uncommonlisp" -ASM="./asm/uncommonlisp" -ASM_GC="./asm/uncommonlisp-gc" +PY="python3 lumbda.py --fast" +C="./c/lumbda" +ASM="./asm/lumbda" +ASM_GC="./asm/lumbda-gc" # Track every server PID we spawn; the EXIT trap kills them all. # Asm has no GC — a leaked server leaks 64 MB per heap growth @@ -34,7 +34,7 @@ cleanup() { rm -rf "${STATIC_DIR:-/nonexistent/xyz}" # Final sanity: any stray servers from examples/http-server? # Narrow to processes actually serving the HTTP example, not the - # shell running this script or tmux sessions with "uncommonlisp" + # shell running this script or tmux sessions with "lumbda" # in their name. local strays strays=$(pgrep -u "$USER" -f 'examples/http-server\.lsp|http\.server 8080' | wc -l) @@ -106,25 +106,25 @@ stop_server() { sleep 0.2 } -# ── uncommonlisp Python ── +# ── lumbda Python ── PID=$(start_server "$PY examples/http-server.lsp" 8080) -bench_one "uncommonlisp Python (/bench, 1 KB)" 8080 /bench +bench_one "lumbda Python (/bench, 1 KB)" 8080 /bench stop_server "$PID" -# ── uncommonlisp C ── +# ── lumbda C ── PID=$(start_server "$C examples/http-server.lsp" 8080) -bench_one "uncommonlisp C (/bench, 1 KB)" 8080 /bench +bench_one "lumbda C (/bench, 1 KB)" 8080 /bench stop_server "$PID" -# ── uncommonlisp asm (bump-only) ── +# ── lumbda asm (bump-only) ── PID=$(start_server "$ASM < examples/http-server.lsp" 8080) -bench_one "uncommonlisp asm (/bench, 1 KB)" 8080 /bench +bench_one "lumbda asm (/bench, 1 KB)" 8080 /bench stop_server "$PID" -# ── uncommonlisp asm-gc (naive mark-sweep + meta-GC build) ── +# ── lumbda asm-gc (naive mark-sweep + meta-GC build) ── if [ -x "$ASM_GC" ]; then PID=$(start_server "$ASM_GC < examples/http-server.lsp" 8080) - bench_one "uncommonlisp asm-gc (/bench, 1 KB)" 8080 /bench + bench_one "lumbda asm-gc (/bench, 1 KB)" 8080 /bench stop_server "$PID" fi @@ -148,9 +148,9 @@ echo echo "═══════════════════════════════════════════════════════════════" echo "Binary sizes" echo "═══════════════════════════════════════════════════════════════" -printf " uncommonlisp asm: %s\n" "$(du -b asm/uncommonlisp | cut -f1) bytes" -[ -x asm/uncommonlisp-gc ] && \ -printf " uncommonlisp asm-gc: %s\n" "$(du -b asm/uncommonlisp-gc | cut -f1) bytes (GC_NAIVE build)" -printf " uncommonlisp C: %s\n" "$(du -b c/uncommonlisp | cut -f1) bytes" +printf " lumbda asm: %s\n" "$(du -b asm/lumbda | cut -f1) bytes" +[ -x asm/lumbda-gc ] && \ +printf " lumbda asm-gc: %s\n" "$(du -b asm/lumbda-gc | cut -f1) bytes (GC_NAIVE build)" +printf " lumbda C: %s\n" "$(du -b c/lumbda | cut -f1) bytes" printf " busybox httpd: %s\n" "$(du -b /usr/bin/busybox | cut -f1) bytes (multi-call)" printf " python3: %s bytes (interpreter binary)\n" "$(du -bL $(which python3) | cut -f1)" diff --git a/whitepaper/WHITEPAPER.pdf b/whitepaper/WHITEPAPER.pdf index 695f540..e0bb2fa 120000 --- a/whitepaper/WHITEPAPER.pdf +++ b/whitepaper/WHITEPAPER.pdf @@ -1 +1 @@ -uncommonlisp-whitepaper.pdf \ No newline at end of file +lumbda-whitepaper.pdf \ No newline at end of file diff --git a/whitepaper/WHITEPAPER.rst b/whitepaper/WHITEPAPER.rst index b61560e..3a2671a 120000 --- a/whitepaper/WHITEPAPER.rst +++ b/whitepaper/WHITEPAPER.rst @@ -1 +1 @@ -uncommonlisp-whitepaper.rst \ No newline at end of file +lumbda-whitepaper.rst \ No newline at end of file diff --git a/whitepaper/uncommonlisp-whitepaper.pdf b/whitepaper/lumbda-whitepaper.pdf similarity index 99% rename from whitepaper/uncommonlisp-whitepaper.pdf rename to whitepaper/lumbda-whitepaper.pdf index d5b6246..1314234 100644 --- a/whitepaper/uncommonlisp-whitepaper.pdf +++ b/whitepaper/lumbda-whitepaper.pdf @@ -584,7 +584,7 @@ endobj endobj 69 0 obj << -/Author () /CreationDate (D:20260419094254-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260419094254-04'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author () /CreationDate (D:20260419101758-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260419101758-04'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title () /Trapped /False >> endobj @@ -875,7 +875,7 @@ endobj endobj 125 0 obj << -/Dest [ 57 0 R /XYZ 57.02362 265.0236 0 ] /Next 126 0 R /Parent 123 0 R /Prev 124 0 R /Title (12.2 MOAD-0002: The Intertangle in Our Own Design) +/Dest [ 57 0 R /XYZ 57.02362 277.0236 0 ] /Next 126 0 R /Parent 123 0 R /Prev 124 0 R /Title (12.2 MOAD-0002: The Intertangle in Our Own Design) >> endobj 126 0 obj @@ -4473,7 +4473,7 @@ endstream endobj 143 0 obj << -/Length 8523 +/Length 8511 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -4492,7 +4492,7 @@ n -6 -6 480.0283 31.2 re B* Q q 0 0 0 rg -BT 1 0 0 1 0 11.2 Tm /F5 8 Tf 9.6 TL (as --64 --defsym GC_NAIVE=1 uncommonlisp.s # collecting build) Tj T* (as --64 uncommonlisp.s # default, bump-only) Tj T* ET +BT 1 0 0 1 0 11.2 Tm /F5 8 Tf 9.6 TL (as --64 --defsym GC_NAIVE=1 lumbda.s # collecting build) Tj T* (as --64 lumbda.s # default, bump-only) Tj T* ET Q Q Q @@ -6477,7 +6477,7 @@ endstream endobj 148 0 obj << -/Length 10633 +/Length 10627 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -6920,7 +6920,7 @@ n -6 -6 480.0283 21.6 re B* Q q 0 0 0 rg -BT 1 0 0 1 0 1.6 Tm /F5 8 Tf 9.6 TL (python3 uncommonlisp.py --portal-resume state.portal) Tj T* ET +BT 1 0 0 1 0 1.6 Tm /F5 8 Tf 9.6 TL (python3 lumbda.py --portal-resume state.portal) Tj T* ET Q Q Q @@ -7905,7 +7905,7 @@ endstream endobj 152 0 obj << -/Length 10223 +/Length 10217 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -8206,7 +8206,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 26 Tm .886835 Tw 12 TL /F3 10 Tf 0 0 0 rg (Self-hosted verification) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (proof/eml_proof.lsp) Tj /F1 10 Tf (\): The same proof runs in Lumbda's bytecode VM) Tj T* 0 Tw 2.063543 Tw (\() Tj /F5 10 Tf (python3) Tj ( ) Tj (uncommonlisp.py) Tj ( ) Tj (--fast) Tj ( ) Tj (proof/eml_proof.lsp) Tj /F1 10 Tf (\). The language verifies its own) Tj T* 0 Tw (mathematical foundations.) Tj T* ET +BT 1 0 0 1 0 26 Tm .886835 Tw 12 TL /F3 10 Tf 0 0 0 rg (Self-hosted verification) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (proof/eml_proof.lsp) Tj /F1 10 Tf (\): The same proof runs in Lumbda's bytecode VM) Tj T* 0 Tw 6.563543 Tw (\() Tj /F5 10 Tf (python3) Tj ( ) Tj (lumbda.py) Tj ( ) Tj (--fast) Tj ( ) Tj (proof/eml_proof.lsp) Tj /F1 10 Tf (\). The language verifies its own) Tj T* 0 Tw (mathematical foundations.) Tj T* ET Q Q q @@ -9374,7 +9374,7 @@ endstream endobj 157 0 obj << -/Length 16605 +/Length 16587 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -10123,7 +10123,7 @@ q n -6 -6 480.0283 40.8 re B* Q q -BT 1 0 0 1 0 20.8 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (python3 uncommonlisp.py --fast examples/http-server.lsp) Tj T* (./c/uncommonlisp examples/http-server.lsp) Tj T* (./asm/uncommonlisp ) Tj (<) Tj ( examples/http-server.lsp) Tj T* ET +BT 1 0 0 1 0 20.8 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (python3 lumbda.py --fast examples/http-server.lsp) Tj T* (./c/lumbda examples/http-server.lsp) Tj T* (./asm/lumbda ) Tj (<) Tj ( examples/http-server.lsp) Tj T* ET Q Q Q @@ -10975,7 +10975,7 @@ endstream endobj 161 0 obj << -/Length 8009 +/Length 7971 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -11091,7 +11091,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 26 Tm .908543 Tw 12 TL /F5 10 Tf 0 0 0 rg (uncommonlisp.py) Tj /F1 10 Tf ('s ) Tj /F5 10 Tf (_tokenize_lines) Tj /F1 10 Tf ( called ) Tj /F5 10 Tf (src.count\('\\n',) Tj ( ) Tj (0,) Tj ( ) Tj (m.start\(\)\)) Tj /F1 10 Tf ( per token to) Tj T* 0 Tw 1.140596 Tw (compute line numbers. O\(N\267M\). Replaced with a single pass that builds a ) Tj /F5 10 Tf (line_starts) Tj /F1 10 Tf ( array, then) Tj T* 0 Tw (bisects per token. O\(M + N log M\).) Tj T* ET +BT 1 0 0 1 0 26 Tm .237594 Tw 12 TL /F5 10 Tf 0 0 0 rg (lumbda.py) Tj /F1 10 Tf ('s ) Tj /F5 10 Tf (_tokenize_lines) Tj /F1 10 Tf ( called ) Tj /F5 10 Tf (src.count\('\\n',) Tj ( ) Tj (0,) Tj ( ) Tj (m.start\(\)\)) Tj /F1 10 Tf ( per token to compute) Tj T* 0 Tw .39789 Tw (line numbers. O\(N\267M\). Replaced with a single pass that builds a ) Tj /F5 10 Tf (line_starts) Tj /F1 10 Tf ( array, then bisects per) Tj T* 0 Tw (token. O\(M + N log M\).) Tj T* ET Q Q q @@ -11102,39 +11102,39 @@ q 1 0 0 1 57.02362 387.0236 cm Q q -1 0 0 1 57.02362 297.0236 cm +1 0 0 1 57.02362 309.0236 cm q -BT 1 0 0 1 0 74 Tm 4.926213 Tw 12 TL /F1 10 Tf 0 0 0 rg (A third correctness fix landed after the portal-over-HTTP demo exposed it: ) Tj /F5 10 Tf (uncommonlisp.py) Tj /F1 10 Tf ('s) Tj T* 0 Tw .515223 Tw /F5 10 Tf (Env.lookup) Tj /F1 10 Tf ( used to short-cut from the local frame directly to the global frame before walking intermediate) Tj T* 0 Tw 1.47713 Tw (parents. That was fast but wrong \227 a let-loop parameter named the same as a global builtin \() Tj /F5 10 Tf (count) Tj /F1 10 Tf (, a) Tj T* 0 Tw .409897 Tw (SRFI-1 procedure\) got shadowed in reverse, the shortcut returned the global builtin instead of walking up to) Tj T* 0 Tw .07402 Tw (the loop's parameter frame. Fix: walk ) Tj /F5 10 Tf (self) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (self.p) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (...) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (global) Tj /F1 10 Tf ( in order, without any shortcut.) Tj T* 0 Tw 1.17189 Tw (The inline cache at ) Tj /F5 10 Tf (OP_LOOKUP) Tj /F1 10 Tf ( was correspondingly tightened to validate the full chain before firing. 980) Tj T* 0 Tw (tests remained green.) Tj T* ET +BT 1 0 0 1 0 62 Tm .226796 Tw 12 TL /F1 10 Tf 0 0 0 rg (A third correctness fix landed after the portal-over-HTTP demo exposed it: ) Tj /F5 10 Tf (lumbda.py) Tj /F1 10 Tf ('s ) Tj /F5 10 Tf (Env.lookup) Tj /F1 10 Tf ( used) Tj T* 0 Tw .794272 Tw (to short-cut from the local frame directly to the global frame before walking intermediate parents. That was) Tj T* 0 Tw .366019 Tw (fast but wrong \227 a let-loop parameter named the same as a global builtin \() Tj /F5 10 Tf (count) Tj /F1 10 Tf (, a SRFI-1 procedure\) got) Tj T* 0 Tw .949897 Tw (shadowed in reverse, the shortcut returned the global builtin instead of walking up to the loop's parameter) Tj T* 0 Tw .453797 Tw (frame. Fix: walk ) Tj /F5 10 Tf (self) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (self.p) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (...) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (global) Tj /F1 10 Tf ( in order, without any shortcut. The inline cache at) Tj T* 0 Tw /F5 10 Tf (OP_LOOKUP) Tj /F1 10 Tf ( was correspondingly tightened to validate the full chain before firing. 980 tests remained green.) Tj T* ET Q Q q -1 0 0 1 57.02362 279.0236 cm +1 0 0 1 57.02362 291.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Every release audit surfaces more. Writing new code is writing new sediment, unless the audit runs.) Tj T* ET Q Q q -1 0 0 1 57.02362 253.0236 cm +1 0 0 1 57.02362 265.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (12.2 MOAD-0002: The Intertangle in Our Own Design) Tj T* ET Q Q q -1 0 0 1 57.02362 235.0236 cm +1 0 0 1 57.02362 247.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (All three implementations share mutable global state between subsystems:) Tj T* ET Q Q q -1 0 0 1 57.02362 229.0236 cm +1 0 0 1 57.02362 241.0236 cm Q q -1 0 0 1 57.02362 229.0236 cm +1 0 0 1 57.02362 241.0236 cm Q q -1 0 0 1 57.02362 181.0236 cm +1 0 0 1 57.02362 193.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -11156,10 +11156,10 @@ Q Q Q q -1 0 0 1 57.02362 175.0236 cm +1 0 0 1 57.02362 187.0236 cm Q q -1 0 0 1 57.02362 139.0236 cm +1 0 0 1 57.02362 151.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -11181,10 +11181,10 @@ Q Q Q q -1 0 0 1 57.02362 133.0236 cm +1 0 0 1 57.02362 145.0236 cm Q q -1 0 0 1 57.02362 97.02362 cm +1 0 0 1 57.02362 109.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -11206,7 +11206,7 @@ Q Q Q q -1 0 0 1 57.02362 79.02362 cm +1 0 0 1 57.02362 91.02362 cm Q endstream @@ -12146,66 +12146,66 @@ xref 0002447433 00000 n 0002457549 00000 n 0002466915 00000 n -0002475491 00000 n -0002486442 00000 n -0002498945 00000 n -0002509558 00000 n -0002518581 00000 n -0002529268 00000 n -0002536885 00000 n -0002546473 00000 n -0002554309 00000 n -0002564586 00000 n -0002574527 00000 n -0002581044 00000 n -0002582879 00000 n -0002596335 00000 n -0002612994 00000 n -0002623502 00000 n -0002630961 00000 n -0002637635 00000 n -0002645697 00000 n -0002653633 00000 n -0002660101 00000 n -0002662257 00000 n -0002663335 00000 n -0002663739 00000 n -0002663774 00000 n -0002663809 00000 n -0002663844 00000 n -0002663879 00000 n -0002663914 00000 n -0002663949 00000 n -0002663984 00000 n -0002664019 00000 n -0002664054 00000 n -0002664090 00000 n -0002664126 00000 n -0002664162 00000 n -0002664198 00000 n -0002664234 00000 n -0002664270 00000 n -0002664306 00000 n -0002664342 00000 n -0002664378 00000 n -0002664414 00000 n -0002664450 00000 n -0002664486 00000 n -0002664522 00000 n -0002664558 00000 n -0002664594 00000 n -0002664630 00000 n -0002664666 00000 n -0002664702 00000 n -0002664738 00000 n -0002664774 00000 n -0002664810 00000 n -0002664846 00000 n -0002664882 00000 n +0002475479 00000 n +0002486430 00000 n +0002498933 00000 n +0002509546 00000 n +0002518569 00000 n +0002529250 00000 n +0002536867 00000 n +0002546455 00000 n +0002554291 00000 n +0002564562 00000 n +0002574503 00000 n +0002581020 00000 n +0002582855 00000 n +0002596311 00000 n +0002612952 00000 n +0002623460 00000 n +0002630919 00000 n +0002637593 00000 n +0002645617 00000 n +0002653553 00000 n +0002660021 00000 n +0002662177 00000 n +0002663255 00000 n +0002663659 00000 n +0002663694 00000 n +0002663729 00000 n +0002663764 00000 n +0002663799 00000 n +0002663834 00000 n +0002663869 00000 n +0002663904 00000 n +0002663939 00000 n +0002663974 00000 n +0002664010 00000 n +0002664046 00000 n +0002664082 00000 n +0002664118 00000 n +0002664154 00000 n +0002664190 00000 n +0002664226 00000 n +0002664262 00000 n +0002664298 00000 n +0002664334 00000 n +0002664370 00000 n +0002664406 00000 n +0002664442 00000 n +0002664478 00000 n +0002664514 00000 n +0002664550 00000 n +0002664586 00000 n +0002664622 00000 n +0002664658 00000 n +0002664694 00000 n +0002664730 00000 n +0002664766 00000 n +0002664802 00000 n trailer << /ID -[<1d446ae1004a02d6f40b0a19c1f8b013><1d446ae1004a02d6f40b0a19c1f8b013>] +[<256838ea1d698f91db2ad0c26a223907><256838ea1d698f91db2ad0c26a223907>] % ReportLab generated PDF document -- digest (opensource) /Info 69 0 R @@ -12213,5 +12213,5 @@ trailer /Size 200 >> startxref -2664918 +2664838 %%EOF diff --git a/whitepaper/uncommonlisp-whitepaper.rst b/whitepaper/lumbda-whitepaper.rst similarity index 98% rename from whitepaper/uncommonlisp-whitepaper.rst rename to whitepaper/lumbda-whitepaper.rst index b2ae75f..4308f63 100644 --- a/whitepaper/uncommonlisp-whitepaper.rst +++ b/whitepaper/lumbda-whitepaper.rst @@ -482,8 +482,8 @@ To measure what a collector would actually cost, we built a second asm binary be .. code-block:: - as --64 --defsym GC_NAIVE=1 uncommonlisp.s # collecting build - as --64 uncommonlisp.s # default, bump-only + as --64 --defsym GC_NAIVE=1 lumbda.s # collecting build + as --64 lumbda.s # default, bump-only Same source, same tests (137/137 pass on both). The GC build adds an 8-byte ``(size << 1 | mark)`` header on every heap block, a stop-the-world mark-sweep triggered by bump overflow, and a free-list allocator that first-fits reclaimed space. @@ -746,7 +746,7 @@ During VM execution, ``portal-checkpoint!`` triggers at ``OP_JUMP`` & ``OP_TAIL_ :: - python3 uncommonlisp.py --portal-resume state.portal + python3 lumbda.py --portal-resume state.portal The computation does not need to restart from the beginning. @@ -954,7 +954,7 @@ The proof has been verified at six distinct levels. Times are best-of-3 on the i 1. **Numerical verification** (``proof/eml_proof.py``): Python script using ``cmath`` at high precision. Verifies every derivation step with tolerance ``1e-10``. Includes brute-force tree search at depth ≤ 4 confirming that eml compositions reach the expected targets. -2. **Self-hosted verification** (``proof/eml_proof.lsp``): The same proof runs in Lumbda's bytecode VM (``python3 uncommonlisp.py --fast proof/eml_proof.lsp``). The language verifies its own mathematical foundations. +2. **Self-hosted verification** (``proof/eml_proof.lsp``): The same proof runs in Lumbda's bytecode VM (``python3 lumbda.py --fast proof/eml_proof.lsp``). The language verifies its own mathematical foundations. 3. **Formal proof** (``proof/lean/EmlProof/Basic.lean``): Lean 4 proof with zero ``sorry``. Five theorems: @@ -1143,9 +1143,9 @@ Sockets share the same port representation as files — in asm the fd is packed :: - python3 uncommonlisp.py --fast examples/http-server.lsp - ./c/uncommonlisp examples/http-server.lsp - ./asm/uncommonlisp < examples/http-server.lsp + python3 lumbda.py --fast examples/http-server.lsp + ./c/lumbda examples/http-server.lsp + ./asm/lumbda < examples/http-server.lsp The companion ``examples/http-client-bench.lsp`` is a 45-line load generator using only the six ``tcp-*`` primitives plus ``current-time-ms``. In-process client eliminates the ~2 ms/request fork overhead that curl-based benchmarks suffer, so real server throughput shows through. **Reproduce:** ``make bench-web`` (source: ``tests/web-benchmark.sh``). @@ -1314,9 +1314,9 @@ The Python implementation had a similar defect: ``_define_record_type`` used ``l **Two more MOAD-0001 defects surfaced during the HTTP server work and were fixed in the same pass:** - ``c/builtins.c``'s ``bi_string_replace`` scanned the source byte-by-byte, calling ``strncmp(src, from, from_len)`` at every position. O(N·k). Replaced with ``strstr`` (libc-tuned, typically Boyer-Moore-Horspool) called in a loop that skips to the next match. O(N + matches·k). -- ``uncommonlisp.py``'s ``_tokenize_lines`` called ``src.count('\\n', 0, m.start())`` per token to compute line numbers. O(N·M). Replaced with a single pass that builds a ``line_starts`` array, then bisects per token. O(M + N log M). +- ``lumbda.py``'s ``_tokenize_lines`` called ``src.count('\\n', 0, m.start())`` per token to compute line numbers. O(N·M). Replaced with a single pass that builds a ``line_starts`` array, then bisects per token. O(M + N log M). -A third correctness fix landed after the portal-over-HTTP demo exposed it: ``uncommonlisp.py``'s ``Env.lookup`` used to short-cut from the local frame directly to the global frame before walking intermediate parents. That was fast but wrong — a let-loop parameter named the same as a global builtin (``count``, a SRFI-1 procedure) got shadowed in reverse, the shortcut returned the global builtin instead of walking up to the loop's parameter frame. Fix: walk ``self → self.p → ... → global`` in order, without any shortcut. The inline cache at ``OP_LOOKUP`` was correspondingly tightened to validate the full chain before firing. 980 tests remained green. +A third correctness fix landed after the portal-over-HTTP demo exposed it: ``lumbda.py``'s ``Env.lookup`` used to short-cut from the local frame directly to the global frame before walking intermediate parents. That was fast but wrong — a let-loop parameter named the same as a global builtin (``count``, a SRFI-1 procedure) got shadowed in reverse, the shortcut returned the global builtin instead of walking up to the loop's parameter frame. Fix: walk ``self → self.p → ... → global`` in order, without any shortcut. The inline cache at ``OP_LOOKUP`` was correspondingly tightened to validate the full chain before firing. 980 tests remained green. Every release audit surfaces more. Writing new code is writing new sediment, unless the audit runs.