如何从闭包定义函数

oct*_*bus 1 clojure

这个问题与我最近问过的问题有关.

如果我重写(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中摆弄它,但到目前为止没有运气.

ama*_*loy 7

使用宏来完全围绕他的问题,即"我有一个生成闭包的函数,我如何给这些闭包名称?" 简单的解决方案是:

(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几次,然后才把是时候涉足宏.但是,除非你将函数定义为至少十分之一的功能,否则你将花费在最简单的宏上的努力量将会被浪费,相比之下,与使用函数执行它的简单性相比.