Clojureメモ: loopとrecur
プログラミングClojureに乗っていた例を写経実行したメモ。
関数を使わずに、再帰的にループするやり方。
(println (loop [result [] x 5] (if (zero? x) result (recur (conj result x) (dec x)))))
実行結果:
[5 4 3 2 1]
ループ分の構造としては
(loop [※A] ... ... (recur ※B))
になっていて、※Aでは関数でいう引数の定義と、加え初期値の代入をしている。
[result [] x 5]
の意味は、result = []
、x = 5
。
(recur ※B)
では、loopの先頭に戻って、※Bで次のresult
とx
を与えている。
これは、イメージ的には無名関数の再帰呼び出しような感じだなあ。と。
関数でrecurを使う場合は以下のようになる。
(defn count-down [result x] (if (zero? x) result (recur (conj result x) (dec x)))) (println (count-down [] 5))
(loop [result [] x 5]
を(defn count-down [result x]
に置き換えただけだ。
初期値は呼び出し側が与えるので、関数の場合は引数の初期値ない。
関数のrecurを使う再帰呼び出し、loopのrecurの記述の一貫性はビューティフルだな。