Использование Clojure of (for) с икотой и нуаром

Я использую clojure и hiccup (с нуаром), и у меня есть этот код:

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

person kfk    schedule 12.11.2011    source источник


Ответы (3)


Этот код даже не компилируется; for принимает ровно два аргумента.

Если вы хотите поместить сразу два элемента в последовательность, возвращаемую for, поместите их в вектор и распакуйте позже.

Хотя лично я предпочитаю mapcat для таких ситуаций. Что-то типа:

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

Я собрал кое-что, что не использует Noir или Hiccup, но, возможно, поможет вам в лучшем направлении. Он использует mapcat вместо for:

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

;;=> ([:dropdown "alessio" [:col0]] [:br] [:dropdown "test" [:col1]] [:br])
person Michiel Borkent    schedule 12.11.2011
comment
Спасибо. Это помогло мне лучше понять mapcat. - person kfk; 12.11.2011

Hiccup автоматически «разворачивает» для вас последовательности/списки (не векторы!), так что вы можете написать это так:

(for [[k v] nms]
  (list (drop-down k v)
        [:br])))
person amalloy    schedule 14.11.2011