Yes, eat your vegetables!
A question of philosophy: If you have all that, don't you already have a DSL, using a deep embedding in the host language?
A question of philosophy: If you have all that, don't you already have a DSL, using a deep embedding in the host language?
With a new DSL, you need to create all of that yourself.
A good one is internally consistent so that users have predictability when writing and reading usage. A good one uses the minimum number of distinct elements required for the problem domain. A good one lets the user focus on what they're trying to do and not how they need to do it.
The principles apply regardless of interface. Physical device, software UI, API, DSL, argument over HN, it's all a continuum.