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"}

できはするが、明瞭さに欠けるので、もちろん非推奨である。

キーワード