8157


以下のコード、recurの部分で、期待してる引数の数と違う、とエラーが出ます。  
recurの引数は式でなければならないのでしょうか？

[code]

    (defn prime [n]
      (let [result []
            x 2]
        (when (and (zero? (rem n x)) (< x n)))
          (conj result x)
        (recur result (inc x))))
    
[/code]


CC BY-SA 3.0
2015-03-19T13:46:37.890
8143
2015-03-20T01:07:11.613
8623
question
clojure
recurの引数に関して


BLUEPIXYさんも言われているとおりですが、`recur`の引数の数が違っています。  
本来、`recur`は`loop`と共に使われ、`recur`が呼び出されることで制御が(1番内側の)`loop`の位置まで戻ります。

[code]

    (loop [x result [], x 2]
      ...
      (recur (conj result x) (inc x))) ...)
    
[/code]

関数定義の先頭には、暗黙の`loop`があるものとして扱われるので、対応する`loop`がない場合には`recur`の呼び出しは制御を関数の先頭まで戻します。挙げられている例のコードは以下と等価です：

[code]

    (defn prime [n]
      (loop [n n]
        (let [result []
              x 2]
          (when (and (zero? (rem n x)) (< x n)))
            (conj result x)
          (recur result (inc x)))))
    
[/code]

ここで、2行目の`loop`と最後の行の`recur`の引数の数が異なるためエラーになります。


CC BY-SA 3.0
2015-03-20T01:07:11.613
8157
2015-03-20T01:07:11.613
496
8143
answer