2017-05-02 89 views
1

我正在處理4clojure's Prime Numbers kata。我的解決方案在我的本地機器上完美運行 (如果效率低下),但它依賴defn,這是 在4輪上禁止的。重構clojure`defn`到`fn`會導致ClassCastException

(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

有什麼我在重構代碼時做錯了嗎?

在旁邊,你爲什麼假設4cljure禁令defdefn

+0

具體在哪裏? – Carcigenicate

+0

你如何運行它? – Carcigenicate

+0

本地運行時的蘋果酒。我正在評估編輯器的s-exp(雖然fn已改爲defn),然後用蘋果酒中的'(x-primes 5)'調用它。 –

回答

6

您使用參數名稱遮蔽了count函數。 (count some-num)正在拋出一個錯誤,因爲在這個範圍內,count是一個數字,而不是函數。

將您的參數名稱從count更改爲其他名稱。


此外,在4Clojure的幫助頁面,有以下線路:

一些操作被禁止,出於安全原因。例如,您將無法使用「def」或切換命名空間。

由於defn只是一個def包裝宏,它是有道理的,它也被禁止。這將如何導致安全問題,但超出了我的想象。

相關問題