【发布时间】:2017-05-02 13:57:39
【问题描述】:
我正在处理4clojure's Prime Numbers
kata。我有完美的解决方案
(如果效率低下)在我的本地机器上,但它依赖于 defn 这是
4clojure 上禁止使用。
(defn factors [n]
(->> n
range
(map inc)
(filter #(zero? (mod n %)))))
(defn prime? [n]
(->> (factors n)
(count)
(= 2)))
(defn n-primes [n]
(->> (range)
(filter prime?)
(take n)))
我尝试将其重构为仅使用匿名函数,但它崩溃了。
(fn x-primes [count]
(let [x-factors (fn factors [n] (->> n range (map inc) (filter #(zero? (mod n %)))))
x-prime? (fn [n] (->> (x-factors n) (count) (= 2)))]
(->> (range)
(filter x-prime?)
(take count))))
抛出以下错误(在本地和使用 4clojure 的编辑器运行时)
ClassCastException java.lang.Long 无法转换为 clojure.lang.IFn
我在重构代码时做错了什么?
顺便说一句,你为什么认为 4clojure 禁止 def 和 defn?
【问题讨论】:
-
具体在哪里?
-
你是如何运行它的?
-
本地运行时的苹果酒。我正在从我的编辑器中评估 s-exp(尽管将 fn 更改为 defn),然后通过以下方式调用它:
(x-primes 5)in cider。 -
我应该注意,在执行 4Clojure 时将代码包装在
fns 中可能是不必要的。你还不如直接输入代码 sn-ps 运行。 -
顺便说一句:您可以使用
letfn到let函数 - 我使用letfn重构了您的代码 here。
标签: clojure refactoring anonymous-function