抽象

    在上面这个例子中,struct A实现了DoFunc函数,我们就可以认为,A实现了IA

    Clojure也提供了abstraction的概念,这里我们主要来了解下sequence abstraction

    First

    返回collection里面的第一个元素,譬如:

    1. user=> (first [1 2 3])
    2. 1
    3. user=> (first '(1 2 3))
    4. 1
    5. 1
    6. user=> (first {:a 1 :b 2})
    7. [:a 1]

    rest返回collection里面,第一个元素后面的sequence,譬如:

    Cons

    1. user=> (cons 1 [1 2 3])
    2. (1 1 2 3)
    3. user=> (cons 1 '(1 2 3))
    4. (1 1 2 3)
    5. user=> (cons 1 #{1 2 3})
    6. (1 1 3 2)
    7. user=> (cons 1 {:a 1 :b 2})
    8. user=> (cons {:c 3} {:a 1 :b 2})
    9. ({:c 3} [:a 1] [:b 2])

    从上面的例子可以看出,Clojure自身的,list等都实现了sequence abstraction,所以他们也能够被一些sequence function调用:

    sequence abstraction类似,Clojure里面的core data structure,譬如vectorlist等,都实现了collection abstraction

    1. user=> (count [1 2 3])
    2. 3
    3. user=> (empty? [])
    4. true
    5. user=> (every? #(< % 3) [1 2 3])
    6. false
    7. user=> (every? #(< % 4) [1 2 3])
    8. true

    into

    一个重要的collection function就是intosequence function通常会返回一个seq,而into会将返回的seq转换成原始的,譬如: