我正在解决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
工作原理模型的方式解释发生了什么吗?非常感谢!
答案 0 :(得分:4)
当您填写函数参数时,您将获得以下内容:
(for [x [1 2 3]
i (range 2)]
x)
;; => (1 1 2 2 3 3)
其中:
(range 2) ;; => (0 1)
docstring所指的最右边的项是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
列。