clojure 函数名作为参数

clojure function name as argument

我需要制作循环方法,它以一些方法名称和循环次数作为参数。

问题是,我不能使用任何突变(def、let 等)以及标准的 clojure 函数,除了 if、inc、dec、println、+、-、= 等

仅限 SEQ 和递归 !!!

我的例子:

;; F = some function name, for example, inc, dec, println and etc.

(defn my-loop [f n]
(if (= n 0)
  f
(my-loop f (dec n))))

;; Returns 2, instead of 3, because on next iteration argument F = nil :(

(my-loop (inc 1) 2)

显然,当调用递归时,参数 F 为 NIL,所以我如何在调用递归时 return 相同的参数(没有硬编码)。

(letfn [(my-loop [f n result]
            (if (< n 1) result
                        (recur f (dec n) (f result))))]
    (my-loop inc 2 1))

感谢帮助,我的解决方法是:

(defn my-loop [f n result]
(if (< n 1)
  result
(my-loop f (dec n) (f result))))

(my-loop inc 2 1)