clojure-基本语法-集合(一)
Clojure提供以下集合类型: list, vector, set, map。并且可以使用Java里面提供的集合类型。所有的clojure集合是不可修改的、异源的以及持久的。不可修改表示集合产生之后,不能从集合里面增加或删除元素。异源表示集合里面可以装任意类型的数据。持久的表示集合有更新时,更新之前的数据还在。CLojure以一种高效的,共享内存的方式来实现集合。
因为clojure里面的集合是不可修改的,所以也就没有对集合进行修改的函数。相反clojure里面提供了一些函数从一个已有的集合来高效地创建新的集合。同时也有一些函数操作一个已有的集合(比如vector)来产生另外一种类型的集合(比如LazySeq), 这些函数有不同的特性。
一、列表List
Clojure的List是单向链表,在头部增加新元素。List形式以“(1,2,3)”符号表示
创建list的方式:
1、通过list创建(这里list是clojure定义的指向clojure.lang.PersistentList的creator方法的符号)
user=> (list 1 2 3)(1 2 3)user=> (list "a" "b" "c")("a" "b" "c")user=> (list "a" 1 2.3 'a :keyname)("a" 1 2.3 a :keyname)
user=> (list* 1 [2 3])(1 2 3)user=> (list* nil [1 2])(nil 1 2)user=> (list* 1 nil)(1)user=> (list* 1 ())(1)
user=> '(1 2 3);'符号阻止对后面的表达式立即求值,与quote意义相同(1 2 3)user=> (quote (1 2 3))(1 2 3)user=> (range 1 10)(1 2 3 4 5 6 7 8 9)user=> (repeat 5 1)(1 1 1 1 1)
user=> (cons 1 (list 2 3 4 5))(1 2 3 4 5)user=> (cons (list 1 2) '(3 4 5))((1 2) 3 4 5)
user=> (conj (list 1 2 3) 4);list在头部增加新元素,所以此处添加在起始位置(4 1 2 3)user=> (conj nil 2)(2)user=> (conj nil 2 3)(3 2)
user=> (peek '(2 3 4))2user=> (peek (list nil "2" 3))nil
user=> (pop '(2 3 4))(3 4)user=> (pop (list nil "2" 3))("2" 3)
user=> (first nil)niluser=> (first ())niluser=> (first (list 1 2 3))1
user=> (rest '(1 2 3))(2 3)user=> (rest nil)()user=> (rest ())()
user=> (vector)[]user=> (vector nil)[nil]user=> (vector 1 2 3)[1 2 3]user=> (vector (list 1 2 3))[(1 2 3)]
user=> (vec (list 1 2 3))[1 2 3]user=> (vec [1 2 3])[1 2 3]user=> (vec '())[]user=> (vec nil)[]
user=> (vector-of :int 1 2 3)[1 2 3]user=> (vector-of :int "1" "2")ClassCastException java.lang.String cannot be cast to java.lang.Character clojure.lang.RT.intCast (RT.java:1076)
user=> (conj [1 2 3] [4])[1 2 3 [4]]user=> (conj [1 2 3] 4);由于vector在尾部增加新元素,所以4添加在末尾[1 2 3 4]user=> (conj '(1 2 3) 4);这里参数为list,由于list在头部增加新元素,所以4添加在1之前(4 1 2 3)user=> (conj ["a" 2 3.4] -1)["a" 2 3.4 -1]user=> (conj ["a" "b"] ["c"])["a" "b" ["c"]]
user=> (peek [1 2 3])3user=> (peek '(1 2 3))1user=> (peek [])nil
user=> (peek [1 2 3])3user=> (pop [1 2 3])[1 2]user=> (peek '(1 2 3))1user=> (pop '(1 2 3))(2 3)
user=> (get [1 2 3] 1)2user=> (get [1 2 3] 4)nil
user=> (assoc [1 2 3] 0 10)[10 2 3]user=> (assoc [1 2 3] 3 10)[1 2 3 10]user=> (assoc [1 2 3] 4 10)IndexOutOfBoundsException clojure.lang.PersistentVector.assocN (PersistentVector.java:136)
user=> (subvec [12 3 4 5 6 7] 2)[4 5 6 7]user=> (subvec [12 3 4 5 6 7] 2 4)[4 5]
user=> (rseq [])niluser=> (rseq [3 5 9 1 3])(3 1 9 5 3)