Итак, чтобы определить это более строго, вы хотите создать макрос, который создает функции конвертера.Функция конвертера - это функция с двумя аргументами, одним аргументом и двумя аргументами.Первый аргумент функции преобразователя - это объект, который нужно преобразовать.Второй аргумент - это карта параметров, которая как-то повлияет на преобразование (например, строка формата в вашем примере.)
Можно указать карту параметров по умолчанию.При вызове с одним аргументом функция конвертера будет использовать карту параметров по умолчанию.При вызове с двумя аргументами функция преобразователя объединит карту параметров по умолчанию с переданной в карте параметров, так что переданные параметры переопределяют значения по умолчанию, если они существуют.
Давайте назовем этот макрос def-converter.Преобразователь Def будет принимать три аргумента, первый - имя создаваемой функции.Второй - это анонимная функция с двумя аргументами, которая реализует двухартериальный преобразователь без объединения параметров по умолчанию.Третьим аргументом является карта параметров по умолчанию.
Что-то вроде этого будет работать:
(defmacro def-converter [converter-name converter-fn default-params]
(defn ~converter-name
([to-convert#]
(let [default-params# ~(eval default-params)]
(~converter-fn to-convert# default-params#)))
([to-convert# params#]
(let [default-params# ~(eval default-params)]
(~converter-fn to-convert# (merge default-params# params#))))))
Тогда вы можете использовать его так:
(def-converter
string-to-date
(fn [to-convert conversion-params]
(parse-date to-convert conversion-params))
(using-format "yyyy-MM-dd"))
Но вы должнывнесите изменения в одну из своих вспомогательных функций:
(defn- parse-date [str params]
(.parse (java.text.SimpleDateFormat. (:format params)) str))
Это потому, что макрос должен быть достаточно общим, чтобы обрабатывать произвольные карты параметров, поэтому мы не можем рассчитывать.Вероятно, есть способы обойти это, но я не могу придумать один случай, который не сложнее, чем просто перенести его на вспомогательную функцию (или анонимную функцию, которую нужно передать в def-конвертер).