В некоторой степени я считаю, что это зависит от использования / цели вашего DSL.
Если вы пишете библиотечный DSL для использования в коде Clojure и хотите, чтобы ониспользовать функционально, тогда я предпочел бы функции макросам.Функции «хороши» для пользователей Clojure, потому что они могут динамически объединяться в функции более высокого порядка и т. Д. Например, вы пишете функциональную веб-среду, такую как Ring .
Если вы пишете императивный DSL, который будет использоваться практически независимо от другого кода Clojure , и вы решили, что вам определенно не нужны функции более высокого порядка, тогда использование будет довольно схожим, и вы сможете выбрать тот, который имеет больше смысла.Например, вы, возможно, создаете какой-то механизм бизнес-правил.
Если вы пишете специализированный DSL , который должен производить высокопроизводительный код , то вы, вероятно, захотите использовать макросы чаще всего.времени, так как они будут расширены во время компиляции для максимальной эффективности.Например, вы пишете некоторый графический код, который необходимо расширить до точно правильной последовательности вызовов OpenGL ......