Это вполне можно сделать функцией. Просто правильной их организацией. Не нужно всё пытаться запихнуть. И в кложе ленивость много где, с ленивостью можно вообще про макросы забыть.
вот у меня пример был с макросом сначала я узнал, что (assoc m :a 1 :b 2) медленнее, чем (-> m (assoc :a 1) (assoc :b 2) и стал писать так а потом написал замену для assoc, и переписыванием занимается макрос