Clojure语言支持哪些数据类型

本文介绍Clojure语言支持哪些数据类型,以及这些数据类型常用的操作。和其它动态语言一样,Clojure提供基本数据类型和集合数据类型。

一、基本数据类型

1.1 Number

1.1.1 Double
user=> (type 3.1415926)
java.lang.Double
1.1.2 Long
user=> (type 20)
java.lang.Long
1.1.3 Ratio
user=> (type 1/8)
clojure.lang.Ratio

1.2 Boolean

user=> (type true)
java.lang.Boolean
user=> (type false)
java.lang.Boolean

在Clojure语言里,除了nil和false,其他值均为真值。
user=> (if 0 true false)
true

1.3 Character

user=> (type \c)
java.lang.Character

1.4 String

user=> (type "hello")
java.lang.String    

1.5 Symbol(标识符)

user=> (defn hello [name]
#_=> (println "hello " name))
user=> (type 'hello)
clojure.lang.Symbol
Symbol标识符用于指定其他值

1.6 Keyword

(type :wast)
clojure.lang.Keyword
和Symbol类似,区别在于Keyword用于指向自身,常用于map中的key

二、集合数据类型

2.1 List

user=> '(1 2 3)
(1 2 3)
user=> (= (list 1 2 ) (list 1 2))
true
user=> (type '(1 2 3))
clojure.lang.PersistentList
user=> (conj '(1 2 3 ) 4)
(4 1 2 3)
List底层用链表存储,使用conj添加元素,添加到链表的头部

2.2 Vector

user=> [1 2 3 ]
[1 2 3]
user=> (type [1 2 3])
clojure.lang.PersistentVector
user=> (vector 1 2 3)
[1 2 3]
user=> (vec (list 1 2 3))
[1 2 3]
user=> (conj [1 2 3] 4)
[1 2 3 4]
user=> ([1 2 3 4] 0)
1   
Vector是栈数据结构的实现,先进后出。使用conj添加元素,插入到尾部。
有三种从Vector取出元素的方法:
user=> (get [1 2 3 4] 2)
3
user=> (nth [1 2 3 4] 3)
4
user=> ([1 2 3 4] 0)
1

2.3 Queue

user=> (def queue1
#_=> (conj clojure.lang.PersistentQueue/EMPTY :a :b :c))
#'user/queue1
user=> (type queue1)
clojure.lang.PersistentQueue
user=> (peek queue1)
:a
user=> (rest queue1)
(:b :c)
user=> (pop queue1)
<-(:b :c)-<
user=> (rest queue1)
(:b :c)
Queue是队列数据结构的实现,先进先出。peek取出元素不删除,pop取出元素并删除。

2.4 Map

user=> {:a "a" :b "b" :c "c"}
{:a "a", :b "b", :c "c"}
user=> (type {:a "a" :b "b"})
clojure.lang.PersistentArrayMap
user=> (assoc {:a "a" :b "b"} :c "c")
{:a "a", :b "b", :c "c"}
user=> (dissoc {:a "a" :b "b" :c "c"} :c)
{:a "a", :b "b"}
user=> (get {:a "a" :b "b" :c "c"} :a)
"a"
user=> ({:a "a" :b "b" :c "c"} :b)
"b"
user=> (:a {:a "a" :b "b" :c "c"})
"a"

2.5 Set

user=> #{:a :b :c}
#{:c :b :a}
user=> (conj #{:a :b :c} :d)
#{:c :b :d :a}
user=> (disj #{:a :b :c :d} :b)
#{:c :d :a}
user=> (conj #{:a :b :c} :a)
#{:c :b :a}
user=> (contains? #{:a :b :c} :a)
true
user=> (set [:a :b :c])
#{:c :b :a}
不存储相同的元素。

三、数据类型的特性

Clojure所有的集合类型是不可变的,修改集合返回一个新的对象。
大部分集合函数具有惰性的特性。 
posted @ 2020-09-19 21:20  孤独剑_001  阅读(212)  评论(0)    收藏  举报