Я немного поиграл с функциями, предложенными Амаллой. Мне не нравится явное указание количества аргументов для карри. Итак, я создал свой собственный макрос. Это старый способ определения функции высокого порядка:
(defn-decorated old-sum
[(curry* 3)]
[a b c]
(+ a b c))
Это мой новый макрос:
(defmacro defn-ho
[fn-name & defn-stuff]
(let [number-of-args (count (first defn-stuff))]
`(defn-decorated ~fn-name [(curry* ~number-of-args)] ~@defn-stuff)))
И это новый неявный способ:
(defn-ho new-sum [a b c] (+ a b c))
Как вы можете видеть, что нет никаких следов (карри) и прочего, просто определите свою прокриченную функцию, как и раньше.
Ребята, что вы думаете? Идеи? Предложения?
Bye!
Alfedo
Edit: я изменил макрос в соответствии с проблемой amalloy о docstring. Это обновленная версия:
(defmacro defhigh
"Like the original defn-decorated, but the number of argument to curry on
is implicit."
[fn-name & defn-stuff]
(let [[fst snd] (take 2 defn-stuff)
num-of-args (if (string? fst) (count snd) (count fst))]
`(defn-decorated ~fn-name [(curry* ~num-of-args)] ~@defn-stuff)))
Мне не нравится выражение if внутри второй привязки. Есть идеи, как сделать его более лаконичным?