letloop is an async runtime for Scheme, built on Chez Scheme, the pico HTTP parser and io_uring.
You write ordinary Scheme. The runtime schedules I/O through io_uring
underneath. There is no function coloring, no await
keyword, no split between “async code” and “normal code”: a procedure
that reads from a socket and one that computes a factorial share the
same calling convention, the same continuation model and the same
debugging tools.
On a trivial counter endpoint, single-threaded, Scheme (pico + io_uring) peaks at 448,768 req/s (64 connections) and holds a p99 of 0.843ms at 256 connections. That places second of 16 HTTP server implementations, behind only C (h2o) at 504,899 req/s and ahead of Rust (axum), Java, Bun, Deno, Go, Node.js and Python. These are micro-benchmarks: they show raw I/O throughput and nothing else.
Work in progress. The scheduler is single-threaded and the error handling story is incomplete.