不太确定这是您要搜索的内容,但可能是宏模板。这是我会怎么写代码:
(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)))
[email protected](->> ns
(map #(vector (->name %) %))
flatten))))
(def-powers-of 2 3 4 5)
user> (power3 3)
;=> 27
user> (power5 3)
;=> 243
PS:如果你刚刚开始使用Clojure,那么这个宏可能看起来很尴尬,不要因为它而放弃! ;-)
我没有得到你的问题。你想创建功能的集合:正方形,立方体等? –
是的。我宁愿采用(power 2)语法,并用power2,power3(立方体)替换它,等等。当然,有一个数学库,在生产代码中,我不会这样做,但我试图将原始函数映射为它将如何接收它的参数,并且在REPL中试用这个函数非常有帮助。 – octopusgrabbus