Поскольку макрос if-empty?
имеет сигнатуру, отличную от if-pred?
с переменной арностью остальной части, ему необходим блок do
для правильной работы.
Ваш макрос if-empty?
имеет несколько проблем, во-первых, он не имеет обратных кавычек, что приведет к
Так что если вам нужно, чтобы if-empty?
работал так, чтобы он вычислял одно выражение, если заданная последовательность пуста, и несколько, если последовательность не пуста, должен работать следующий макрос:
(defmacro if-empty? [lst then & else] `(if-pred? empty? ~lst ~then (do ~@else)))
Если аргументы & before были несчастным случаем, должны работать следующие:
(defmacro if-empty? [lst then else] `(if-pred? empty? ~lst ~then ~else))
Как примечание, поскольку предикаты этих макросов не используются, я бы не использовал? в конце их имени.