#(对于[x%,i(范围%2)] x)如何做它的作用?

时间:2013-10-19 03:58:09

标签: clojure

我正在解决4clojure.com问题(这是问题33),我不能为我的生活弄清楚这是如何工作的:

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

我可以看到forx绑定到[1 2 3],然后某事两次(i绑定到'(0 1) ),但我希望得到像'([1 2 3] [1 2 3])这样的答案。看起来这段代码在某种程度上在输出上做mapcat

for的文档字符串包含以下内容:Collections are iterated in a nested fashion, rightmost fastest...。这让我直觉i0, 1, 2的值x采取了直觉,但我不能说我明白发生了什么。

有人可以通过改善for工作原理模型的方式解释发生了什么吗?非常感谢!

1 个答案:

答案 0 :(得分:4)

当您填写函数参数时,您将获得以下内容:

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

其中:

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

docstring所指的最右边的项是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列。