核心中的一些函数使用这种通过 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 中的想法是,如果条件为真,则让每个阶段更改值,或者如果条件为假,则将其原封不动地返回。这种模式为函数式代码提供了命令式的外观,并有助于明确值是如何构造的,尽管在使用它将命令式逻辑“转换”为函数式程序时也可能太过分了。