Robert Strandh — ELS 2026
Talk
| Field | Value |
|---|---|
| Title | A Highly Configurable Common Lisp Reader |
| Authors | Jan Moringen, Robert Strandh |
| Session | ELS 2026 — Day 1, Session 2 (Language) |
| Time | 2026-05-11 15:30–16:00 CEST |
| Venue | 2nd floor, Długa 72, 31-146 Kraków, Poland |
Primary work the talk points to
The "highly configurable CL reader" is Eclector.
- Canonical repo
- s-expressionists/Eclector
- Strandh mirror
- robert-strandh/Eclector
- Characterization
- portable Common Lisp reader, error-recovering, optionally produces concrete syntax trees, customization via CLOS client pattern.
Three mechanisms carry the "highly configurable" claim:
- Client pattern. The reader's behavior is selected by specializing
CLOS methods on a client class. A consumer subclasses
eclector.parse-result:parse-result-clientand providesmake-expression-result/make-skipped-input-resultto shape what the reader emits. The reader is not a function with options; it is a protocol with implementations. - First-class error recovery. A
recoverrestart is established whenever a recovery strategy is available for the signaled condition. Recovery is part of the reader contract, not an exception layer. The recovery messages themselves carry the diagnosis ("Treat the character as if it had been escaped", "Use NIL in place of the missing object"), which means downstream tools get a structured account of what was malformed and what assumption was made. - Concrete syntax tree output. The
eclector.concrete-syntax-treesystem returns source-tracked CST nodes rather than naked s-expressions. The reader becomes a spec-emitter for downstream static analysis.
Broader corpus
GitHub :: robert-strandh
- SICL — fresh CL implementation, designed for portability and reuse rather than performance for its own sake
- Second Climacs — Emacs-like editor in CL, uses Eclector + Incrementalist for incremental parsing
- Cluffer — extracted buffer library, performance-oriented for large buffers
- CLOSOS — operating system inspired by CL's interactive environment
- Concrete Syntax Tree — library for source-tracked AST representation; counterpart to Eclector's CST output mode
- HIR — high-level intermediate representation as control-flow graph
- Cleavir — CL compilation framework (referenced across SICL and other implementations)
Strandh's program reads as: build the library that should exist, factor concerns aggressively, accept the cost of fewer shipped end-user applications. Eclector, Cluffer, Concrete Syntax Tree, and SICL form a deliberately-factored stack with cleanly separated layers.
Concern mapping (refined)
Original ELS 2026 writeup row :: L2 / "Reader is a parser-as-protocol surface, not a constant."
Refined after Eclector inspection :: the claim survives and sharpens. The client pattern is the protocol surface; error recovery and CST output are additional protocol slots. The reader is best read as three protocols in one shell — token construction, error recovery, and parse-result shaping — each independently overridable.
Adjacent layer :: L3 (Specification). CST output mode means the reader emits the type of artifact downstream specification and analysis tooling consumes. Reader-as-protocol generalizes to reader-as-spec-emitter.
Resonance with JW work
emacs-mcp-maximalist- Eclector's client pattern is a working example of the obarray-exposure thesis: behavior is a protocol clients subclass, not a hardcoded surface. The mapping is direct — every CL system that wants different reader behavior is already paying the cost of client subclassing; emcp asks the same of every Emacs subsystem.
elenctic-spec- Eclector's
recoverrestart is externalized progressive hardening. Each recovery strategy is a refinement rule with a named justification. The pattern is what elenctic-spec would look like if it had a parser. aqgossip protocol- parsing untrusted NDJSON with recovery rather than failing closed. Eclector's recovery model is what aq needs at the protocol-parser boundary.
guile-sage- the Scheme analog of Eclector — hygienic reader with client/recovery surface — does not exist in Guile to my knowledge. Worth a writeup as guile-sage adjacency.
Claim under test (refined)
| Layer | Claim |
|---|---|
| Original | Reader is a parser-as-protocol surface, not a constant. |
| Refined | Eclector exposes three independent protocol slots (token construction, recovery, result shape); the configurability is structural, not parametric. |
| Stretch | Concrete-syntax-tree output mode pushes reader-as-protocol up to reader-as-spec-emitter, which is the layer downstream tooling actually consumes. |
Refutation
- If Moringen's contribution is the headline and Strandh is co-author by courtesy, framing should center Moringen specifically. He is a major Eclector contributor in his own right; check the talk emphasis live.
- If "configurable" turns out to be narrower than the client protocol (e.g., readtable manipulation or reader macros at the standard CL level), the L2/L3 framing overreaches and should collapse to a plain L2 row.
- If the talk is mostly about a new configuration axis added to Eclector since the last public release, the corpus framing above is stale by one release cycle.
Cross-links
- ELS 2026 event page — parent writeup
- Scheme research — minimalist Lisp tradition for comparison; Eclector's hygiene/recovery model is the CL-side analog
- Elenctic Vibe Code Review — the methodology Eclector formalizes at the reader layer
emcp-obarray-exposure-as-tool-contract.org(planned companion)eclector-recovery-as-elenctic-refinement.org(planned companion)
