2013-10-19 35 views
2

我通过4clojure.com问题(这是从问题33)的工作,我不能为我的生活弄清楚如何工作的:#(对于[x%,i(范围%2)] x)是怎么做的呢?

(#(for [x %, i (range %2)] x) [1 2 3] 2) ; --> '(1 1 2 2 3 3) 

我可以看到for结合x[1 2 3]然后做东西两次(i绑定到'(0 1)),但我期待一个答案,如'([1 2 3] [1 2 3])。它看起来像这个代码在某种程度上在输出上做了mapcat

for的文档字符串包括以下内容:Collections are iterated in a nested fashion, rightmost fastest...。这给了我直觉ix的价值0, 1, 2,但我不能说我明白发生了什么。

有人可以解释发生了什么,以改善我的心智模型for如何工作?非常感谢!

+0

“x”中的每个元素与“i”中的元素一样多次使用。例如:'(for [x [1 2 3] i [0 0]] x)'会给你同样的结果'(1 1 2 2 3 3)' – tolitius

+0

tolitius和Jared314,谢谢你的答案。 Jared314,我的想法是有关'x'绑定的错误。你的回答 - 写得非常好 - 帮助我理解了另一种“for”的用法,这也让我感到困惑。再次感谢! –

回答

4

当你在函数的参数填入你会得到如下:

(for [x [1 2 3] 
     i (range 2)] 
    x) 
;; => (1 1 2 2 3 3) 

其中:

(range 2) ;; => (0 1) 

文档字符串指的是最右边的项目为i,它有两个元素。所以,如果你展开循环,xi将进度如下表所示:

(clojure.pprint/print-table 
    (for [x [1 2 3] i (range 2)] {:x x :i i})) 

| :x | :i | 
|----+----| 
| 1 | 0 | 
| 1 | 1 | 
| 2 | 0 | 
| 2 | 1 | 
| 3 | 0 | 
| 3 | 1 | 

for结果是循环的每次迭代返回一个包含结果的列表。在这种情况下,您只是返回x,因此您的结果列表仅对应于上表中的x列。

相关问题