4

私はclojureとhiccup(noirを使用)を使用しており、次のコードがあります:

(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))
4

3 に答える 3

5

そのコードはコンパイルさえしません。ちょうど 2 つの引数forを取ります。

によって返されるシーケンスに一度に 2 つのアイテムを配置する場合はfor、それらをベクトルに配置し、後でアンパックします。

個人的には、これらの状況ではmapcatを好みますが。何かのようなもの:

(into (form-to [:post (format "/dataset/table/%s" id)])
  (mapcat #(vector (drop-down % (nms %)) [:br]) nms))
于 2011-11-12T10:46:11.480 に答える
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])
于 2011-11-12T10:52:27.007 に答える
0

Hiccup は自動的に seq/list (ベクトルではありません!) を「アンラップ」するので、次のように書くことができます:

(for [[k v] nms]
  (list (drop-down k v)
        [:br])))
于 2011-11-14T02:13:53.443 に答える