注: Clojure recur は、引数が 1 つしかないと考えるのはなぜですか?の複製ではありません。. ループは使っていません。
(def t
#(let [[low high] (sort %&)] {:low low :high h}))
(t 3 2)
=> {:low 2, :high 3}
これが期待どおりに機能することを考えると。なぜこれができないのですか:
(def t
#(let [[low high] (sort %&)]
(if (= 0 low)
nil
(do
(println {:low low :high high})
(recur low (dec high))))))
(t 3 2)
=> java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2
1つの引数が必要であると言われていることを考えると、引数をコレクションに変換することで機能させることができると推測できます。
(def t
#(let [[low high] (sort %&)]
(if (= 0 low)
nil
(do
(println {:low low :high high})
(recur [low (dec high)])))))
(t 3 2)
=> {:low 2, :high 3}
{:low 2, :high 2}
{:low 1, :high 2}
{:low 1, :high 1}
nil
... しかし、なぜ?