Design a DSL that reads well in code and stays testable: prefer data-first shapes, add macros only when needed.
An “internal DSL” is a domain-specific language that lives inside Clojure itself. The goal is readability: make domain rules look like domain rules, while keeping the implementation understandable.
This section shows a practical progression: start with a data DSL (maps/vectors), interpret it with functions, then add macro sugar only if it materially improves clarity.