Захотелось мне как-то добавить логирование в свое приложение. Но писать вызовы логгера в каждый функции я посчитал плохим тоном, да и не укладывается это в функциональную, парадигму side эффект как никак. Писать генератор оберток мне тоже не захотелось, неэффективно это как-то и тогда появился идея написать макрос, который будет генерировать определения функций с логированием входных параметров. В результате получилось вот это:
(def debug true)
(defmacro defhandler [handler-name args & body]
(if debug
(let [msg (str handler-name " " args)]
`(defn ~handler-name [~@args]
(println ~msg ~args)
~@body))
`(defn ~handler-name [~@args]
~@body)))
;usage
(defhandler foo [x y] (+ x y))
Теперь будет логироваться название функции и её переменных. Без рефлекшена. Восхитительно!
(def debug true)
(defmacro defhandler [handler-name args & body]
(if debug
(let [msg (str handler-name " " args)]
`(defn ~handler-name [~@args]
(println ~msg ~args)
~@body))
`(defn ~handler-name [~@args]
~@body)))
;usage
(defhandler foo [x y] (+ x y))
Теперь будет логироваться название функции и её переменных. Без рефлекшена. Восхитительно!
Комментариев нет:
Отправить комментарий