與地圖一樣,集合是關聯的和無序的。與包含從鍵到值的對映的對映不同,集合實際上是從鍵對映到它們自身。

一個集合由大括號表示,前面是一個八角形:

#{}
;;=> #{}

#{:foo}
;;=> #{:foo}

#{:foo :bar}
;;=> #{:bar :foo}

與地圖一樣,元素在文字集中出現的順序無關緊要:

(= #{:foo :bar} #{:bar :foo})
;;=> true

你可以使用 set? 謂詞測試某些內容是否為集合 :

(set? #{})
;;=> true

(set? #{:foo})
;;=> true

(set? #{:foo :bar})
;;=> true

(set? nil)
;;=> false

(set? 42)
;;=> false

(set? :foo)
;;=> false

你可以使用 contains? 謂詞測試地圖是否在常量時間內包含給定專案 :

(contains? #{} :foo)
;;=> false

(contains? #{:foo} :foo)
;;=> true

(contains? #{:foo} :bar)
;;=> false

(contains? #{} nil)
;;=> false

(contains? #{nil} nil)
;;=> true

另外,set 本身是一個函式,它接受一個元素,如果它存在於集合中則返回該元素,如果不存在則返回 nil

(#{} :foo)
;;=> nil

(#{:foo} :foo)
;;=> :foo

(#{:foo} :bar)
;;=> nil

(#{} nil)
;;=> nil

(#{nil} nil)
;;=> nil

你可以使用 conj 獲取具有現有集合的所有元素的集合,以及一個附加專案:

(conj #{} :foo)
;;=> #{:foo}

(conj (conj #{} :foo) :bar)
;;=> #{:bar :foo}

(conj #{:foo} :foo)
;;=> #{:foo}

你可以使用 disj 獲取具有現有集合的所有元素的集合,減去一個專案:

(disj #{} :foo)
;;=> #{}

(disj #{:foo} :foo)
;;=> #{}

(disj #{:foo} :bar)
;;=> #{:foo}

(disj #{:foo :bar} :foo)
;;=> #{:bar}

(disj #{:foo :bar} :bar)
;;=> #{:foo}

count 以恆定時間返回元素數:

(count #{})
;;=> 0

(count (conj #{} :foo))
;;=> 1

(count #{:foo :bar})
;;=> 2

你可以使用 seq 獲取集合中所有元素的序列:

(seq #{})
;;=> nil

(seq #{:foo})
;;=> (:foo)

(seq #{:foo :bar})
;;=> (:bar :foo)