When you design a eDSL out of functions you get a lot of expressive power for free because you can lean on the host language&#x27;s composition facilities. However this also means you have to shoehorn your semantics into an existing set of constraints (this is addressed by the &quot;If possible&quot; qualifier in &quot;If possible, do things without macros&quot;) and you have to adopt all the complexity that the host language enables.<p>One big advantage of a DSL is that it limits complexity so that it&#x27;s easier to predict what code will do, even if you haven&#x27;t read it yet. With a macro-based DSL, you can know exactly what functionalty expressed in the DSL can and cannot do, which makes it easier to reason about without studying the code for hours.