Я пишу это, чтобы проиллюстрировать процесс. в этом коде много ошибок, но этот процесс поможет вам как можно быстрее развлечься :)
запишите вызов вашего макроса и то, что вы хотите, чтобы этот вызов перевести (этот шаг не является обязательным;)
(my-cond (even? 4) 42 (odd? 4 24))
(if (even? 4) 42 (if (odd? 4) 24)))
написать шаблон для простейшего случая, а затем передать его (macroexpand-1 ...) и переворачивать, пока он не совпадет
(defmacro my-cond [test result] `(if ~test ~result nil))
(macroexpand-1 '(my-cond (even? 4) 42) ==> (if (even? 4) 42)
теперь сделайте его более общим
(defmacro my-cond [& cases]
`(if (if ~(first cases) ~(second cases) ~(my-cond (drop 2 cases))
и затем поиграйте с ним в macroexpand-1, затем в macroexpand (без «-1»), чтобы убедиться, что он полностью расширяется в правильные регистры
затем пройдитесь и очистите угловые случаи, где есть нечетное количество терминов и т. д. *
затем посмотрите в core.clj и посмотрите, как близко вы подошли.