2017-07-18 103 views
1

我是Clojure的新手,我想動態構建矢量/列表。動態矢量/列表創建

我已經建立了這個功能generate-map返回一個map,如:

{:key 1, :value 1, :other [...]} 

在這個其他功能get-statement,我有一個doseq調用此函數generate-map

(defn get-statement 
    [st] 
    (doseq [s st] (generate-map s))) 

我想建立一個地圖上的doseq呼叫連接所有這些generate-maps收益,例如:

[{:key 1, :value 1, :other [...]} 
{:key 2, :value 2, :other [...]} 
{:key 3, :value 3, :other [...]}] 

我怎麼能這樣做?謝謝!

+0

1.不要使用'doseq'因爲您需要結果。使用'for'。 2.查找「進入」功能。 '(進入{} ...)'。我會發佈一個答案,但我在時鐘上:/ – Carcigenicate

+0

3.你想創建的結果看起來是非法的;地圖需要是鍵/值對。你的意思是你想要一個地圖矢量嗎? – Carcigenicate

+0

謝謝!它的工作:) – isamendonca

回答

4

如果你想創造一些地圖,並把它們放入一個載體,只使用一個for,無論使用哪種vec(into [] ...)混合

(into [] ; ... and place them in a vector 
    (for [d data] ; ...for each datum in data... 
    (generate-map d))) ; Generate a map... 

或者mapv

(mapv generate-map data) ; Super succinct! 

切勿使用doseq這樣的事情。 doseq不會返回任何東西,所以你不得不使用一些​​或其他效果混亂,實際上沒有任何東西擺脫循環。

  • 使用doseq當你需要執行一個副作用,不直接從它需要的任何結果。

  • 如果循環後需要結果,則使用for,map,reduce(或任何其他功能循環結構)。