将clojure`defn`重构为`fn`会导致ClassCastException
我正在工作。我有一个完美的解决方案 (如果效率低下)在我的本地计算机上,但它依赖于 禁止在4月4日将clojure`defn`重构为`fn`会导致ClassCastException,clojure,refactoring,anonymous-function,Clojure,Refactoring,Anonymous Function,我正在工作。我有一个完美的解决方案 (如果效率低下)在我的本地计算机上,但它依赖于 禁止在4月4日 (defn factors [n] (->> n range (map inc) (filter #(zero? (mod n %))))) (defn prime? [n] (->> (factors n) (count) (= 2))) (defn n-primes [n] (->
(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
?您正在用参数名隐藏count
函数(count some num)
正在引发错误,因为在此范围内,count
是一个数字,而不是一个函数
将参数名称从count
更改为其他名称
另外,在4Clojure的帮助页面中,有以下行: 出于安全原因,某些操作被禁止。例如,您将无法使用“def”或切换名称空间
由于
defn
只是一个def
包装宏,因此它也是被禁止的。但是,我无法理解这将如何导致安全问题。您正在用参数名隐藏count
函数(count some num)
正在引发错误,因为在此范围内,count
是一个数字,而不是一个函数
将参数名称从count
更改为其他名称
另外,在4Clojure的帮助页面中,有以下行: 出于安全原因,某些操作被禁止。例如,您将无法使用“def”或切换名称空间
由于
defn
只是一个def
包装宏,因此它也是被禁止的。但是,我无法理解这将如何导致安全问题。具体在哪里?您是如何运行它的?本地运行时使用苹果酒。我从我的编辑器中评估了s-exp(尽管fn改为defn),然后在苹果酒中通过:(x-primes 5)
调用它。但我应该注意,在执行4Clojure时,用fn
s包装代码可能是不必要的。您也可以只输入要运行的代码段。顺便说一句:您可以使用letfn
来let
函数-我使用letfn
重构了您的代码。具体在哪里?您是如何运行它的?本地运行时的苹果酒。我从我的编辑器中评估了s-exp(尽管fn改为defn),然后在苹果酒中通过:(x-primes 5)
调用它。但我应该注意,在执行4Clojure时,用fn
s包装代码可能是不必要的。您也可以只输入要运行的代码段。顺便说一句:您可以使用letfn
来let
函数-我使用letfn
重构了您的代码。