具体来说就是它不会计算参数,所以第一个参数不是函数值也没有问题。 Clojure的向量(vector)跟数组类似,实际上,基本上可以把Clojure列表等同于Java的LinkedList,向量等同于ArrayList。向量可以用方括号表示。 (vec)形式以一个列表为参数,并用这个列表创建向量,而(vector)形式以多个独立符号为参数,并返回包含它们的向量...
(def zs (concat xs ys)) 1. 可以看到xs和ys都存留了下来,在内存中只有xs做了复制,而ys被共享了,因为图中蓝色的部分和xs并不完全一样 Vector Vector是Clojure里一般被理解作类似Java里的ArrayList的数据结构。 user=> (type [0 1 2]) clojure.lang.PersistentVector 1. Vector同样也是持久化的数据类型。
(def zs (concat xs ys)) 可以看到xs和ys都存留了下来,在内存中只有xs做了复制,而ys被共享了,因为图中蓝色的部分和xs并不完全一样 Vector Vector是Clojure里一般被理解作类似Java里的ArrayList的数据结构。 user=> (type [0 1 2]) clojure.lang.PersistentVector Vector同样也是持久化的数据类型。 事实上Vect...
vector和hash-set分别有一个亲戚vec和set,它们不接受可变参数,而是接受一个容器: (set [:a :b :c]) ;=> #{:c :b :a} (vec {:a 1, :b 2, :c 3}) ;=> [[:a 1] [:b 2] [:c 3]] 过滤、截取序列 Clojure中常用的过滤函数filter我们在上文中已经介绍过了,这里不再赘述。
(concat [1 2] '(3 4)) ; => (1 2 3 4) 用filter来过滤集合中的元素,用map来根据指定的函数来映射得到一个新的集合 (map inc [1 2 3]) ; => (2 3 4) (filter even? [1 2 3]) ; => (2) recuce使用函数来规约集合 (reduce + [1 2 3 4]) ...
apply还有一个重要作用就是“脱括号”的作用。比如 当参数是[[], []] 这种时,想用concat 把nest2个vector连接起来,用 (apply concat[vec1, vec2]) 相当于(concat vec1 vec2) ——微吐槽:不如py的 list extend() 或者*解引用 itertools.chain(*[vec1 vec2]) ...
Clojure 关于 vector 操作的源码, 我也是后来再去看了下. 其他部分也没去看. 所以当时对 Clojure 具体的实现, 心里还是有点茫然的. 当然, 从前面的文章当中, 我知道, 那是要的 B+ 树, 然后 32 分支, 然后结构复用. 我为了简化问题, 就考虑直接用比较少的分支, 比如 2 个 3 个这样, ...
(class [1 2 3]); => clojure.lang.PersistentVector (class '(1 2 3)); => clojure.lang.PersistentList ;书写一个列表形如(1 2 3)一样简单, 但是我们不得不把它“引”(前面加个单引号)起来 ;这样就能防止解释器把它当做一个函数来解析 ;另外,(list 1 2 3) 和 '(1 2 3) 等价 ;列表和...
(class [1 2 3]); => clojure.lang.PersistentVector (class '(1 2 3)); => clojure.lang.PersistentList ;书写一个列表形如(1 2 3)一样简单, 但是我们不得不把它“引”(前面加个单引号)起来 ;这样就能防止解释器把它当做一个函数来解析 ...
Clojure提供了很多集合函数,常用的有map、 reduce、concat、some、filter、apply等,它们在seq抽象的各种数据结构中表现的行为是一致的。 ;;; map 依次对集合中的元素应用函数 (map inc [1 2 3]) ;=> (2 3 4) ;;; reduce 传入一个聚合函数和列表,最后转聚合为一个结果 ...