Clojureの内包表記

こんなテーブルから

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| display_name | text         | NO   |     | NULL    |                |
| email        | varchar(255) | NO   | UNI | NULL    |                |
| user_name    | varchar(32)  | NO   | UNI | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

idとdisplay_nameだけを取り出した

[[1 "user_name_1"] [2 "user_name_2"] [3 "user_name_3"]]

こんな形のデータを作りたくて(hiccupのdrow-downに渡すデータ)調べたんだけど
なかなかいいサンプルが見つからなかったので結局REPLでガチャガチャやって解決。

; usersにselect * from userの結果が入っている
(for [user users] [(:display_name user) (:id user)])

こんな感じでいけた

for - clojure.core | ClojureDocs - Community-Powered Clojure Documentation and Examples
ここのサンプルを見ると、:whenを使うことでフィルタリングする条件とかもつけられるらしい。
これは便利そう。

ちなみに、持ってきたデータの先頭に「選択してください」みたいな
valueが空のデータを追加したい場合はconsを使うと出来た

(cons ["選択してください" ""] (for [user users] [(:display_name user) (:id user)]))

Clojureは表現力が高く、とても良い言語なんだけどまだ慣れないなー。