Можете ли вы заменить одно на другое в достаточно сложной или простой ситуации? Да
Они одинаковые? Совсем нет.
У каждого есть свои плюсы и минусы, и все зависит от того, что нужно. Если вам нужно, чтобы его можно было изменять во время выполнения, то использование функции на скомпилированном языке может оказаться не лучшим решением (хотя это все еще возможно), поскольку оно будет слишком тяжелым для ваших нужд.
Цель DSL состоит в том, чтобы точно определить ваши потребности и создать язык, который охватывает только эти потребности, чтобы его было как можно проще представить. Таким образом, наш ограниченный мозг может легко представить, что это за данные, без необходимости компилировать программу.
Кроме того, достаточно простой DSL может быть легко проанализирован и отредактирован другой программой. В конце концов, вы создали синтаксис и инкапсулировали его в библиотеку, верно?
В вашем примере выше:
a.isSubReportOf(b) || b.isSubReportOf(a)
еще сложнее понять мысленно, чем сказать:
a <-> b