Интересует вопрос, можно ли в диалектах Lisp писать макросы, которые преобразуют не один S-expression, находя его по первому элементу списка, а позволяют указать более сложный шаблон, по которому искать дерево для трансформации?
Чтобы было понятнее, пример на псевдоязыке:
(defmacro (swap-begin _* :as contents swap-end)
(reverse contents))
Такой макрос по задумке должен выдать все S-exp между swap-begin и swap-end в обратном порядке:
=> (macroexpand '(swap-begin (+ 1 2) (println "whatever") (/ 2 1) swap-end))
((/ 2 1) (println "whatever") (+ 1 2))
Извиняюсь, если получилось немного сумбурно; надеюсь, общая идея понятна.
У самого есть подозрение, что нужно глубже гуглить по словам reader macro или code walking, но не уверен (я пока только начинаю знакомиться с Lisp).