2017-05-02 10 views
1

私は4clojure's Prime Numbers kataで作業しています。私は完全にローカルマシン上で (効率的でない場合)機能するソリューションを持っていますが、それはdefnに依存しています。これは4clojureで禁止された です。`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

ローカルで実行しているときのサイダー。私は私の編集者(fnがdefnに変更されたにもかかわらず)からs-expを評価していました。そしてそれをサイダーの '(x-primes 5)'で呼び出しました。 –

答えて

6

count関数をパラメータ名でシャドーイングしています。 (count some-num)は、このスコープではcountが数値であり、関数ではないため、エラーをスローしています。

countからパラメータ名を変更してください。

一部の操作は、セキュリティ上の理由から禁止されています:


また、4Clojureのヘルプページには、次の行があります。たとえば、 "def"やスイッチの名前空間を使用することはできません。 defn以来

がちょうどdefラッピングマクロで、それはそれはも禁止だという意味があります。どのようにすればセキュリティ上の問題が発生するのでしょうか?

関連する問題