Clojure使用(for)打嗝和黑色

kfk*_*kfk 4 clojure hiccup noir

我正在使用clojure和打嗝(黑色),我有这个代码:

(defn dataframe [id]
   (db/db-to-data id))

(defpartial drop-downs [nms]
  (for [nm (keys nms)] (drop-down nm (get nms nm))[:br])
  (submit-button "Refresh")  
  )

(defpage "/dataset/table/:id" {:keys [id]}
  (common/layout
    (form-to [:post (format "/dataset/table/%s" id)]
      (drop-downs {"alessio" [:col0], "test" [:col1]})
      )
   (html-table (dataframe id))))
Run Code Online (Sandbox Code Playgroud)

我的问题是:

(for [nm (keys nms)] (drop-down nm (get nms nm))[:br])
Run Code Online (Sandbox Code Playgroud)

我希望在我的表单中有多个选择.上面这一行就是这样,但由于某些原因,它不考虑[:br],所以它不会破坏这些行.但是,如果我这样做:

(form-to [:post (format "/dataset/table/%s" id)]
      (drop-down "Test1" "1")[:br]
      (drop-down "Test2" "2")[:br]
      )
Run Code Online (Sandbox Code Playgroud)

[:br]标签确实有效.我相信这与(for)宏如何工作有关,但我无法弄清楚原因以及如何解决它.

编辑

据我所知,我放弃使用for.下面的最终结果(这是Joost以轻微模式回答):

(mapcat #(vector (drop-down % (nms %)) [:br]) (keys nms))
Run Code Online (Sandbox Code Playgroud)

Joo*_*aat 5

那段代码甚至没有编译; for只需要两个参数.

如果要在返回的序列中一次放置两个项目for,请将它们放在向量中并稍后将其解压缩.

虽然我个人更喜欢mapcat用于这些情况.就像是:

(into (form-to [:post (format "/dataset/table/%s" id)])
  (mapcat #(vector (drop-down % (nms %)) [:br]) nms))
Run Code Online (Sandbox Code Playgroud)