2013-10-19 38 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列。

相關問題