lumbda/c
russell@unturf.com 574ddc50d7 S-expressions over sockets — RPC + remote REPL in portable Scheme
Fuses portal (Scheme-source-as-interchange) with sockets (bytes over
the network). Wire protocol: one S-expression per connection. Same
server + client .lsp runs byte-identically in Python, C, and asm.

New primitives in all three impls:
- read-from-string — parse one sexp from a string

Asm gets two more:
- symbol->string — standard R7RS, was missing
- eval — evaluate a Scheme value in the global env (Python + C had
  it as a special form; asm exposes it as a builtin)

examples/rpc-server.lsp (port 9080):
- Whitelisted dispatch: ping / add / mul / fib / echo
- Never calls eval on client input; safe by construction
- Uses heap-snapshot/restore for O(1) memory on asm
- ~90 lines, portable

examples/rpc-client.lsp:
- Sends one request, reads one response, displays both
- 45 lines, portable

examples/repl-server.lsp (port 9081):
- DANGER: full remote eval. Any Scheme form accepted and evaluated
  in the server's global env. Persistent across connections.
- Deliberately does NOT use heap-snapshot — remote (define x ...)
  lives in the global env above any snapshot point; rewinding would
  invalidate the new binding. The ulimit -v 512 MB safety net
  (documented in CLAUDE.md) ensures an escaped process can't crash
  the machine.
- ~70 lines, portable. Demonstrates what "the language IS the
  interchange format" gets you at the limit: a single socket and
  a single primitive (eval) carry a full-powered REPL.

Verified 3×3 server×client matrix: all 9 combinations green.
All 132 asm + 571 py + 189 shared + 83 c tests still pass.

One quirk discovered and worked around: in asm, a closure captures
its env chain by pointer at define time. Forward-referenced names
in mutually-recursive toplevel defines can fail under specific
heap-restore patterns — see the leaf-first ordering note in
rpc-server.lsp.
2026-04-17 09:00:04 -04:00
..
.gitignore Add C implementation: 7,429 lines, 58 tests, identical output 2026-04-14 14:55:17 -04:00
bench.c JIT: add named-let loops, let/let*, and/or, car/cdr/cons, 18 new tests 2026-04-14 20:50:24 -04:00
builtins.c S-expressions over sockets — RPC + remote REPL in portable Scheme 2026-04-17 09:00:04 -04:00
eval.c C: add deep_copy_env, VM frame stack for continuations 2026-04-15 19:57:17 -04:00
jit.c JIT: add named-let loops, let/let*, and/or, car/cdr/cons, 18 new tests 2026-04-14 20:50:24 -04:00
jit.h Add GPU architecture notes and JIT header 2026-04-14 19:43:16 -04:00
main.c x86_64 JIT: 12-21x faster than CPython, 230x faster than interpreter 2026-04-14 19:58:26 -04:00
Makefile C: add full continuations, portal save/resume, 7 new tests 2026-04-15 20:07:09 -04:00
portal.c C: add full continuations, portal save/resume, 7 new tests 2026-04-15 20:07:09 -04:00
printer.c Add C implementation: 7,429 lines, 58 tests, identical output 2026-04-14 14:55:17 -04:00
reader.c Add C implementation: 7,429 lines, 58 tests, identical output 2026-04-14 14:55:17 -04:00
test.c C: add full continuations, portal save/resume, 7 new tests 2026-04-15 20:07:09 -04:00
types.c C: add deep_copy_env, VM frame stack for continuations 2026-04-15 19:57:17 -04:00
uncommonlisp.h C: add full continuations, portal save/resume, 7 new tests 2026-04-15 20:07:09 -04:00
vm.c C: add full continuations, portal save/resume, 7 new tests 2026-04-15 20:07:09 -04:00