LIPS is a Scheme (R7RS/R5RS) interpreter written in JavaScript, designed to run in browsers, Node.js, and Web Workers. The core interpreter (lexer, parser, evaluator, environments, types, serialization) lives in a monolithic `src/lips.js` (~10k+ lines), while roughly half the standard library is written in Scheme itself (`lib/`), including R7RS base procedures, SRFI implementations, and a bootstrap library. The system is self-hosting: the standard library is compiled to a binary CBOR+LZJB format (`dist/std.xcb`) for fast loading. The interpreter features both unhygienic macros (`define-macro`) and hygienic macros (`syntax-rules` with `free-identifier=?`), first-class continuations with tail-call optimization, a full numeric tower (complex numbers, exact rationals), and deep JavaScript interop (dot access, `new`, Promises, ES modules, `require`). It ships with a REPL (terminal and browser), a CLI (`bin/lips.js`), and a Docusaurus documentation site with an interactive interpreter. The codebase is actively maintained (last commit Sept 2026) with a comprehensive test suite including R7RS conformance tests, snapshot tests for parser output, and Scheme-level test files. Known limitations include some failing tests (marked `test.failing`), a monolithic core that is hard to navigate, and dual macro systems that can confuse contributors. The project is in beta with frequent breaking changes (documented in CHANGELOG.md).
This repository is a comprehensive, cross-implementation benchmark suite for R7RS Scheme. It provides a standardized harness that compiles and runs approximately 50 benchmarks (covering numerical, symbolic, I/O, GC, and meta-circular workloads) across more than 30 Scheme implementations, capturing execution times and correctness results. The suite exposes portability gaps, performance differences, and implementation bugs through its per-implementation prelude/postlude system, which adapts the common benchmark code to each Scheme's dialect. Results are output as CSV files and aggregated into summary tables and HTML charts (via graph-gmean.scm and graph.scm). While the benchmarks are well-structured and the harness is robust, many implementations are broken or incomplete, preludes are fragile workarounds, and the codebase shows age-related drift (e.g., deprecated APIs, hardcoded paths, and inputs too small for modern hardware).