2017-07-18 52 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(或任何其他功能循环结构)。