Clojure: Создание функций из шаблона

У меня есть следующий код для общей библиотеки преобразования:

(defn using-format [format] {:format format})

(defn- parse-date [str format]
  (.parse (java.text.SimpleDateFormat. format) str))

(defn string-to-date
  ([str] 
    (string-to-date str (using-format "yyyy-MM-dd")))
  ([str conversion-params] 
    (parse-date str (:format (merge (using-format "yyyy-MM-dd") conversion-params)))))

Мне нужно можно назвать это так:

(string-to-date "2011-02-17")

(string-to-date "2/17/2011" (using-format "M/d/yyyy"))

(string-to-date "2/17/2011" {})

Третий случай несколько проблематичен: карта не обязательно содержит ключ : формат , который имеет решающее значение для функции. Вот почему объединяет со значением по умолчанию.

Мне нужно иметь дюжину подобных функций для преобразований между всеми другими типами. Есть ли более элегантный способ, который не потребовал бы от меня копирования-вставки, использования merge и т. Д. В каждой отдельной функции?

В идеале, искать что-то вроде этого (макрос?):

(defn string-to-date
  (wrap
     (fn [str conversion-params] 
       (parse-date str (:format conversion-params))) ; implementation
     {:format "yyyy-MM-dd"})) ; default conversion-params

. .. что создаст перегруженную функцию (унарную и двоичную) с двоичной, имеющей слияние , как в первом примере.

6
задан Konrad Garus 17 February 2011 в 21:46
поделиться