TL;DR
- Clojure のマップは
{ }かhash-mapで定義し、getやマップ自身、キーワードのキーを関数として呼び出して値を取得する。 assocで要素を追加し、dissocで削除する。元のマップは変わらない。
内容
定義
Clojure では次のように定義する。
{ "name" "Bashir" "age" 12 } ;; {"name" "Bashir", "age" 12}hash-map を使って定義することもできる。
(hash-map "name" "Bashir" "age" 20)
;; {"name" "Bashir", "age" 20}要素の取得
キーを指定して値を取得するには、get を使う。
(def friend { "name" "Bashir" "age" 12 })
(get friend "name") ;; "Bashir"次のような簡潔な書き方でも取得できる。
(friend "name") ;; "Bashir"キーにキーワードを使う
マップのキーには キーワード(:name)を使うこともできる。
(def wise-friend {:name "Periyaar" :age 90})この場合でも、文字列のときと同じように値を取得できる。
(wise-friend :name) ; "Periyaar"
(get wise-friend :age) ; 90次のように、print 関数と合わせて使うこともできる。
(print (wise-friend :name) "is very wise") ; Periyaar is very wise集合のキーワードの場合と同じく、次のように書いても要素を取得できる。キーワード :name を関数として扱い、マップを渡して値を取得している。
(:name wise-friend) ; "Periyaar"要素の追加
assoc を使うと、要素を追加できる。
(assoc wise-friend :belief "Rationalism")
;; {:name "Periyaar", :age 90, :belief "Rationalism"}dissoc を使うと、要素を削除できる。
(dissoc wise-friend :age) ; {:name "Periyaar"}どちらの操作をしても、元のマップは変わらない(イミュータブル)。
(assoc wise-friend :belief "Rationalism")
(wise-friend :belief) ; nil
(dissoc wise-friend :age)
(wise-friend :age) ; 90キー / 値だけを取得する
keys を使うと、マップのキーのリストを取得できる。
(keys wise-friend) ; (:name :age)同じように vals を使うと、値のリストを取得できる。
(vals wise-friend) ; ("Periyaar" 90)キーワードと文字列で同じキー名を指定する
キーワードと文字列は別物なので、同じ名前のキーワードと文字列のキーをそれぞれ定義できる。
(assoc wise-friend "name" "Ramasamy")
;; {:name "Periyaar", :age 90, "name" "Ramasamy"}できはするが、明瞭さに欠けるので、もちろん非推奨である。