这个问题与我最近问过的问题有关.
如果我重写(fn [n] (fn [x] (apply * (repeat n x))))为
(defn power [n] (fn [x] (apply * (repeat n x))))`
Run Code Online (Sandbox Code Playgroud)
这样使用时效果很好
((power 2) 16)
Run Code Online (Sandbox Code Playgroud)
我可以用另一种力量代替2,但我想为正方形,立方体等制作一个函数.最好的方法是什么?我一直在REPL中摆弄它,但到目前为止没有运气.
使用宏来完全围绕他的问题,即"我有一个生成闭包的函数,我如何给这些闭包名称?" 简单的解决方案是:
(letfn [(power [n]
(fn [x]
(apply * (repeat n x))))]
(def square (power 2))
(def cube (power 3)))
Run Code Online (Sandbox Code Playgroud)
如果你真的真的讨厌重复def,并power几次,然后才把是时候涉足宏.但是,除非你将函数定义为至少十分之一的功能,否则你将花费在最简单的宏上的努力量将会被浪费,相比之下,与使用函数执行它的简单性相比.