コアの一部の関数は、同じシンボルをaにチェーンするこのパターンを使用して、let
条件付きで値を作成します。contition1を永久ループしない例に変更し、whenをifに変更して、ループの最後に値を返すことができるようにする必要がありました。
(defn myfunc [x someval1 someval2 condition1 condition2 condition3]
(loop [x x retur '()]
(if (condition1 x)
(let [templist '()
templist (if condition2 (conj templist {:somekey1 someval1}) templist)
templist (if condition3 (conj templist {:somekey2 someval2}) templist)]
(recur (+ x 1) (concat retur templist)))
retur)))
その後、テストすることができます:
user> (myfunc 0 1 2 #(< % 5) true true)
({:somekey2 2} {:somekey1 1} {:somekey2 2} {:somekey1 1} {:somekey2 2}
{:somekey1 1} {:somekey2 2} {:somekey1 1} {:somekey2 2} {:somekey1 1})
user> (myfunc 0 1 2 #(< % 5) true false)
({:somekey1 1} {:somekey1 1} {:somekey1 1} {:somekey1 1} {:somekey1 1})
letの考え方は、条件がtrueの場合は各ステージで値を変更し、条件がfalseの場合は変更せずに値を返すことです。このパターンは、関数型コードに命令型の外観を与え、値がどのように構築されるかを明確にするのに役立ちますが、命令型ロジックを関数型プログラムに「変換」するためにそれを使用することもできます。