2011-11-12 87 views
4

我使用的Clojure和打嗝(有黑色)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)))) 

我的問題是:

(for [nm (keys nms)] (drop-down nm (get nms nm))[:br]) 

我想在我的表單中有多個選擇。上面的這一行是這樣做的,但由於某些原因,它不考慮[:br],所以它不會破壞行。但是,如果我這樣做:

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

[:br]標籤確實有效。我相信這與(for)宏的工作方式有關,但我無法弄清楚原因以及如何解決它。

編輯

建議我放棄使用for。下面的最終結果(這是Joost的回答,稍微修改):

(mapcat #(vector (drop-down % (nms %)) [:br]) (keys nms)) 

回答

5

該代碼甚至沒有編譯; for需要正好兩個的論點。

如果您想在for返回的順序中一次放入兩個項目,請將它們放入矢量中並稍後解壓縮。

雖然我個人更喜歡mapcat這些情況。喜歡的東西:

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

我放在一起一點點的東西,不使用比諾或打嗝,但也許會引導你在一個更好的方向發展。它採用會員名:mapcat而不是爲:自動

(let [nms {"alessio" [:col0], "test" [:col1]}] 
    (mapcat 
    (fn [mapentry] [[:dropdown (first mapentry) (second mapentry)] [:br]]) nms)) 

;;=> ([:dropdown "alessio" [:col0]] [:br] [:dropdown "test" [:col1]] [:br]) 
+0

感謝。這幫助我更好地理解mapcat。 – kfk

0

打嗝 「解開」 seqs /列出了你,所以你可以寫爲(未矢量!):

(for [[k v] nms] 
    (list (drop-down k v) 
     [:br])))