如何从循环中收集数据

时间:2016-05-02 19:26:22

标签: clojure

大家好,如何从循环中的if条件中收集数据

(defn update-f [a b]
 (let[data(loop [i 0]
         (when (< i (count a))
           ;;(println i)
            (if (every? (set b) (nth (for [x a]  (set (list x))) i))
                    (nth (for [x a]  (conj x "new")) i)
                    (nth (for [x a]  (conj x "old")) i))
           (recur (inc i))))])); loop i will take this value

我可以打印数据来自if条件我需要从这个函数中获取数据

1 个答案:

答案 0 :(得分:1)

您可以通过添加额外的“累加器”参数来循环收集数据:

(loop [i 0 acc []]
  (if (< i 5)
    (recur (inc i) (if (even? i) 
                       (conj acc i)
                       acc))
    acc))

然而,似乎你想要实现的目标可以写得更简洁(如果我得到了你想要的东西):

(defn are-new? [a b]
  (map (fn[i] [i (if (b i) :new :old)]) a))

我们正在映射a中的每个项目,以便为其添加:new:old标记。集合也充当函数,当集合中存在参数时返回truthy值。因此,要查找某个项i是否已设置为b,我们只需执行(b i)

你可以测试一下:

(let [r (are-new? [[1 2 3] [2 3 4] [1 2]] #{[1 2 3] [1 2]})]
  (doseq [i r]
    (println i)))

> [[1 2 3] :new]
> [[2 3 4] :old]
> [[1 2] :new]