среда, 4 мая 2011 г.

Мой первый макрос на Clojure.

Захотелось мне как-то добавить логирование в свое приложение. Но писать вызовы логгера в каждый функции я посчитал плохим тоном, да и не укладывается это в функциональную, парадигму 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))

Теперь будет логироваться название функции и её переменных. Без рефлекшена. Восхитительно!

Комментариев нет:

Отправить комментарий