For loop 在应用程序中实现计数器

For loop 在应用程序中实现计数器,for-loop,clojure,For Loop,Clojure,我想迭代一个集合,同时还要维护一个计数器 (for [x (range 10) y (inc 0)] [x y] ) 我希望“y”代表计数器,因此对于每个元素,输出都是([0 0][1 1][2]…)。我该怎么做?您可以使用fromclojure.contrib.seq。例如: (indexed '(a b c d)) => ([0 a] [1 b] [2 c] [3 d]) (map-indexed vector "foobar") => ([0 \f] [1 \o]

我想迭代一个集合,同时还要维护一个计数器

(for [x (range 10) y (inc 0)] [x y] )
我希望“y”代表计数器,因此对于每个元素,输出都是([0 0][1 1][2]…)。我该怎么做?

您可以使用from
clojure.contrib.seq
。例如:

(indexed '(a b c d))  =>  ([0 a] [1 b] [2 c] [3 d])
(map-indexed vector "foobar")  =>  ([0 \f] [1 \o] [2 \o] [3 \b] [4 \a] [5 \r])
您也可以使用。例如:

(indexed '(a b c d))  =>  ([0 a] [1 b] [2 c] [3 d])
(map-indexed vector "foobar")  =>  ([0 \f] [1 \o] [2 \o] [3 \b] [4 \a] [5 \r])

按照Simeon的建议,使用
地图索引
。在
for
上下文中,可以方便地使用解构来轻松访问计数器和集合元素:

(for [ [y x] (map-indexed vector (range 10) ) ] [x y] )

> ([0 0] [1 1] [2 2] [3 3] [4 4] [5 5] [6 6] [7 7] [8 8] [9 9])


另外,请记住,在Clojure中使用索引通常是一种代码味道

我想,如果这个问题还没有被标记为“已回答”,那么您可能还在寻找其他问题,也许是定义您自己的计数器的灵活性

我同意其他人的观点,对于您概述的特定问题,
映射索引是一条可行之路。但是,如果您坚持对
使用,我建议您这样做:

(for [[x y] (map vector (range 10) (iterate inc 0))]
  [x y])
Rafal有一个非常相似的答案,除了计数器总是从零开始,然后递增1。在我的版本中,您可以根据需要定义计数器。例如,通过将上面的
(iterate inc 0)
更改为
(iterate#(+2%)10)
,您可以得到一个从10开始递增2的计数器