如果我理解正確的Clojure可以返回列表(如在其他的Lisp),而且載體和集。什麼決定了何時創建集合?
我真的不明白就是爲什麼有沒有總是返回的集合。
例如,如果我採取以下的代碼:
(loop [x 128]
(when (> x 1)
(println x)
(recur (/ x 2))))
它確實打印128 64 32 16 8 4 2但是,這只是因爲的println被調用並的println具有副作用( ?)印刷東西。
所以我試圖用這個替換它(去除的println):
(loop [x 128]
(when (> x 1)
x
(recur (/ x 2))))
而且我期待得到一些收集(據說列表),像這樣:
(128 64 32 16 8 4 2)
而是我得到無。
我不明白,這決定了創建一個收集,什麼不和你如何從一個到另一個切換。另外,看到Clojure以某種方式鼓勵一種「功能性」編程方式,是不是應該幾乎總是返回集合?
爲什麼,顯然不返回任何集合如此多的功能?什麼是做這些返回集合的慣用方法?
例如,我將如何通過首先構建集合解決上述問題,然後迭代(?)的其他慣用的方式將得到的列表/矢量?
首先,我不知道如何來改造循環以使它產生別的東西比零然後我試過如下:
(reduce println '(1 2 3))
但它打印「1個2nil 3nil」而不是「1 2 3nil」我期待着。
我意識到這是基本的東西,但我剛開始和我顯然在這裏失去了基本的東西。
(PS:重新標記適當,我不知道我應該在這裏使用的術語)
你的'when'是不對的,你應該使用'if'理解。即使如此,你會返回一個數字「x」。你實際上必須從某個地方創建一個列表來返回列表。 – 2012-04-28 16:24:17
@Seth Carnegie:好的但是......我的問題是如何確定什麼是創造什麼:例如,爲什麼*當*不在這裏工作,我怎麼知道?這是否意味着*當*只能用在有副作用的函數中? – 2012-04-28 16:35:54
@CedricMartin函數式編程沒有什麼魔力。返回一個數字就是這樣 - 返回一個數字,沒有別的。 (在你的情況中,由於數字被返回到一個不關心返回值的上下文中(非'尾部'位置的'when'主體子句),它會立即被丟棄,所以什麼都不會發生。)如果你想要一個集合,你需要明確地創建它。關於'when':'when'的用途恰恰是*副作用,所以在學習函數式編程時,最好避免它。 – 2012-04-28 17:29:43