Не совсем уверен, что это то, что вы ищете, но это могут быть шаблоны макросов.Вот как я написал бы ваш код:
(use 'clojure.template)
(do-template [name n]
(defn name [x] (apply * (repeat n x)))
square 2
cube 3)
user> (cube 3)
;=> 27
Для более сложных типов подобных задач вы могли бы написать макрос, который обернул бы do-template
для выполнения некоторого преобразования его аргументов, например:
(defmacro def-powers-of [& ns]
(let [->name #(->> % (str "power") symbol)]
`(do-template [~'name ~'n]
(defn ~'name [~'x] (apply * (repeat ~'n ~'x)))
~@(->> ns
(map #(vector (->name %) %))
flatten))))
(def-powers-of 2 3 4 5)
user> (power3 3)
;=> 27
user> (power5 3)
;=> 243
PS: Этот макрос может выглядеть неловко, если вы только начинаете с Clojure, не сдавайтесь из-за этого!; -)