Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将clojure`defn`重构为`fn`会导致ClassCastException_Clojure_Refactoring_Anonymous Function - Fatal编程技术网

将clojure`defn`重构为`fn`会导致ClassCastException

将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] (->

我正在工作。我有一个完美的解决方案 (如果效率低下)在我的本地计算机上,但它依赖于 禁止在4月4日

(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
重构了您的代码。