动态矢量/列表创建

isa*_*nca 1 clojure

我是 Clojure 的新手,我想动态构建一个向量/列表。

我构建了这个generate-map返回 a 的函数map,例如:

{:key 1, :value 1, :other [...]}
Run Code Online (Sandbox Code Playgroud)

在这个其他函数中get-statement,我调用了doseq这个generate-map函数。

(defn get-statement
  [st] 
  (doseq [s st] (generate-map s)))
Run Code Online (Sandbox Code Playgroud)

我想构建一张地图,generate-maps通过调用连接所有这些返回doseq,例如:

[{:key 1, :value 1, :other [...]}
 {:key 2, :value 2, :other [...]}
 {:key 3, :value 3, :other [...]}]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?谢谢!

Car*_*ate 5

如果你想创建一些地图,并将它们放入向量中,只需使用 a for,与vec或混合(into [] ...)

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

或者mapv

(mapv generate-map data) ; Super succinct!
Run Code Online (Sandbox Code Playgroud)

切勿用于doseq此类用途。doseq不返回任何内容,因此您必须使用一些atom或其他效果混乱才能真正从循环中获取任何内容。

  • doseq当您需要执行副作用但不直接需要它的任何结果时使用。

  • 如果循环后需要结果,请使用for, map, (或任何其他功能循环构造)。reduce