2

我正在解决这些4clojure.com问题(这是来自问题 33),我一生都无法弄清楚这是如何工作的:

(#(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.... 这给了我i对 的值0, 1, 2的直觉x,但我不能说我理解发生了什么。

有人能以一种可以改善我对工作原理的心理模型的方式来解释正在发生的事情for吗?非常感谢!

4

1 回答 1

4

当您填写函数参数时,您会得到以下信息:

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

在哪里:

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

文档字符串所指的最右边的项目是i,它有两个元素。所以,如果你展开循环,x并且i会像下表一样进行:

(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于上表中的列。

于 2013-10-19T04:10:23.353 回答