Week 1 线程和锁
优点
易于实现,适用场景广,接近“硬件本质”。
缺点
不够抽象,难以单元测试、Debug、不可重现故障。
Week 2 函数式编程
Day0 Clojure
- 动态类型
- 懒惰列表
- JVM 上的 Lisp 方言
- 没有可变状态,利于并行化
- 不支持尾调用消除,不要依赖递归写法
- 使用
lein run
运行项目,lein repl
进行交互式编程
Day1 词频统计
代码语言:javascript复制(defn my-frequencies [words]
(reduce
fn [counts word] (assoc counts word (inc (get counts word 0)))
{}
words))
;; some def
(defn get [counts] key) ;; map getter
(defn assoc [counts] key value) ;; map setter
(defn get-words [text] (re-seq #"w " text))
;; partial for short
(map (partial * 2) [0 1 2])
(map (fn [x] (* x 2)) [0 1 2])
;; 读取器宏 #(%1 %2 ...)
#(freq (get-words %))
(fn [page] (freq (get-words page))
;; pmap, 并行化map, 仅生成部分需要结果,半懒惰(semi-lazy)
(pmap #(freq (get-words %)) pages)
;; 合并 map
(merge-with f & map)
(defn count-words-sequantial [pages]
(frequencies (mapcat get-words pages)))
Day1 并行化 & fold
优点
。
缺点
。