2016-10-24 5 views
1

factors関数を定義しようとしましたが、loop/recurを使用して数値のすべての要素のベクトルを返します。loop/recur関数のPersistentVectorに渡されるargs(0)の数が間違っています

;; `prime?` borrowed from https://swizec.com/blog/comparing-clojure-and-node-js-for-speed/swizec/1593 

(defn prime? [n] 
    (if (even? n) false 
     (let [root (num (int (Math/sqrt n)))] 
     (loop [i 3] (if (> i root) true 
         (if (zero? (mod n i)) false 
          (recur (+ i 2)))))))) 

(defn factors [x] (
    (loop [n x i 2 acc []] 
    (if (prime? n) (conj acc n) 
     (if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i)) 
      (recur n (inc i) acc)))))) 

しかし、私は次のようなエラーに実行しておいてください。私はここに何かを明らかに不足しているしなければならない

ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity

。どんな提案も大歓迎です!

答えて

5

はそれが間違っているものをあなたに明らかですので、私はあなたのコード内の空白文字を移動してみましょう:

(defn factors [x] 
    ((loop [n x i 2 acc []] 
    (if (prime? n) (conj acc n) 
     (if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i)) 
      (recur n (inc i) acc)))))) 

あなたは、あなたの関数の開始時にその奇妙な((を参照してください?そのすべては何ですか? Clojureでは、一般的にリスプのように、かっこはグループ化のコンストラクトではありません。!それらは関数呼び出しの仕組みであり、あなたは楽しみのために余分なものを投げることはできません。あなたが書いたものは次の意味を持っています:

  1. Run this loop that will compute a vector.
  2. Call the resulting value as a function, passing it no arguments.
+0

うわー、私はこれらの括弧を追跡することをより重視しなければならない。余分なカッコのセットを削除することはトリックでした...ありがとう! – user1797455

関連する問題