# Dialect support is an Options struct with orthogonal flags, not a Dialect-enum switch

We considered two shapes for supporting four Lisp dialects (Scheme, Common Lisp, Emacs Lisp, Clojure) from one crate: (a) a shared lexer/parser core with a single `Dialect` enum that switches bundles of behavior wholesale, or (b) per-dialect separate parser implementations. Before deciding, we surveyed prior art — `lexpr` (rotty/lexpr-rs) and `s-expr` (vincenthz/s-expr) — and found both converge on a third shape: one parser core driven by an `Options`/`TokenizerConfig` struct of individually-toggleable, orthogonal syntax flags (bracket meaning, string/char syntax, keyword syntax, etc.), with named preset constructors (e.g. `Options::elisp()`) that bundle flags for a given dialect rather than hard-coding a dialect switch. We adopt this shape: a `Dialect` in lispexp is a named preset of `Options`, not a separate code path or a monolithic enum branch — this matches proven precedent and leaves room for cross-dialect flag combinations (e.g. a future Racket-like preset) without restructuring the core.
