clojure学习记录

take 从列表中获取子列表

into a b  把b conj 到a中

 

(defn count-a-seq [lat]
  (reduce (fn [x y] (+ x 1)) 0 lat))

reduce 将list通过fn一个个合并成一个,当然也可以只是对每个进行+1

 

(defn [x & xs]

reduce #(if (> %1 %2) %1 %2) x xs 

)

 

#(mapcat vector %1 %2)

对%1 %2每个对应元素进行vector,然后concat在一起

 

drop-last 干掉最后一个

flatten 将所有集合合并在一起

take-last 取最后几个

 

comp 返回一个将所有参数函数从右到左依次应用的函数

( (apply comp (repeat ntime (if (> n 0) lshift rshift))) coll))

 

{} #{} hash-map and hash-set

(contains? [1 1 1 1 1] 4) => true 因为contains只看index

 some 取第一个满足条件的

 

 (take 10 (map last (iterate (fn [[x y]] [y (+ x y)]) [0 1]))) 迭代器的每个元素是一个二元组,最终取出其中一个组成fib

 

 flattern

(defn flat [coll]
(mapcat
#(if (sequential? %) (flat %) [%]) coll))

 

https://github.com/qiuxiafei/4clojure/blob/master/answers/28.Flatten%20a%20Sequence

(filter (complement sequential?) (tree-seq sequential? identity '((1 2) 3 [4 [5 6]])))

别人的版本,通过映射成树,然后收集叶子节点来进行flattern,想法不错哦

 

group-by identity coll 通过identity变成hash-map一个key一个vector的形式、

map hash-map的时候使用 (fn [[k v]] [k (count v)])

into {}  ([:b 3] [:a 2]) => {:b 3, :a 2}

(conj nil num) 这样可以建立一个'(num)

--------------

 

突然想到从cfunc - object -lisp的一个变迁的过程,可能是越来越抽象

比如map这个函数,把平时的普通循环做的事情抽象到每个做映射,这个是普通java里没有的抽象,而这种抽象在lisp里处处可见

 

前缀的=,可以任意参数的

posted @ 2014-11-27 22:59  wangchao719  阅读(233)  评论(0编辑  收藏  举报