带计数的 Clojure 循环

Ike*_*ira 0 clojure

我是 Clojure 的新手,会帮助处理一些代码。我有一个接受向量的函数,我想遍历向量并获取索引“i”处的值和“i”本身的值。'i' 是在循环中递增的值。

我在Clojure的文档检查“为”在和写了下面的代码。

(for [i some-vector]
      (print (get-intersec i (.length some-vector) loop-count)))
Run Code Online (Sandbox Code Playgroud)

循环计数变量应该是循环计数。

我也检查了循环,但它似乎不是一个可行的解决方案。有人可以帮助我使用我可以使用的 clojure 函数,或者帮助我编写可以执行此操作的宏或函数。

谢谢你。

Ps:为了解决我的问题,我使用自己的计数器,但想要更好的解决方案。

jas*_*jas 5

首先,请记住这for是用于列表理解,即创建新序列。为了循环遍历一个序列以获得一些副作用,比如打印,你可能想要使用doseq.

要在循环时包含每个元素的数字计数,您可以使用map-indexed

(def xs [:a :b :c :d])

(doseq [[n elem] (map-indexed #(vector %1 %2) xs)]
  (println n "->" elem))
Run Code Online (Sandbox Code Playgroud)

输出:

0 -> :a
1 -> :b
2 -> :c
3 -> :d
Run Code Online (Sandbox Code Playgroud)

如果你发现自己经常这样做,就像我一样,你可以创建一个宏:

(defmacro doseq-indexed [[[item idx] coll] & forms]
  `(doseq [[~idx ~item] (map-indexed #(vector %1 %2) ~coll)]
     ~@forms))
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

> (doseq-indexed [[n elem] xs] (println n "->" elem))
0 -> :a
1 -> :b
2 -> :c
3 -> :d
Run Code Online (Sandbox Code Playgroud)