4 releases (breaking)

0.4.0 May 27, 2023
0.3.0 May 22, 2023
0.2.0 May 17, 2023
0.1.0 May 15, 2023

#4 in #clojure




This is an S-Expression parser and formatter with the following goals:

  • Offering direct access to the tokenizer, anysexpr::parse, but also anysexpr::read to build an in-memory tree easily.

  • Good error reporting (precise location information and messages).

  • (Future) Make the data constructors for anysexpr::read parametrizable (generic), e.g. like in the sexpr_parser crate.

  • Streaming: allow to read from and print to file handles lazily, for use e.g. in communications. This currently works by using anysexpr::parse directly for input, or creating tokens to print via a custom loop for output. Future: more possibilities, e.g. turn a tree into a token stream, or parameterize with a tree that's generated on demand while printing.

  • (Future) Support various s-expression variants (R*RS, Guile, Clojure, Common Lisp, ..) via runtime (and compile-time?) settings.

  • (Perhaps) be usable on microcontrollers (small code, no-std?).

The author is quite new to Rust. There will be API guideline entries not currently being followed, help in that area is as welcome as in other areas.


See examples/main.rs.


  • string escape features on printing
  • inexact and complex numbers
  • performance tuning?, perhaps do not use genawaiter?
  • better error behaviour: parser should return errors but try to make it possible to continue?
  • more tests (large test corpora, fuzzing round trips)
  • handle Guile, Clojure and other syntax versions
  • parametrization (generics) for tree generation / mapping (also/vs. Serde?)
  • lazy features as mentioned above
  • some level of support for pretty-printing


  • examine the lexpr crate in more detail (missed when researching existing crates before starting this project)


Christian Jaeger ch@christianjaeger.ch


~40K SLoC