開始前
其實這個東西并不是Spam Filter的核心,因為這樣只是展示了一種簡單的數據存儲的方式。atom
這種方式是可以使用數據庫來代替的,那些DSL會更加方便,在這里只不過跟著教程在跑了一遍基礎。
Build A Record
(defrecord People [name cnt])
defrecord
宏可以用來定義一個記錄,而 name、cnt 就是 People 的屬性。
Store A Record
(def a (atom #{}))
(swap! a conj (People. "banana" 0))
atom
類型的 a 其實是一個可變的 hashset。意味著你可以對這個 hashset 進行操作。
Query A Record
(defn sq [ds key]
(first (filter #(= key (.name %)) ds)))
; (sq @a "banana")
找到 name == “banana” 這條記錄。
Update A Record
(swap! a (partial replace
{(sq @a "banana")
(update-in (sq @a "banana") [:cnt] inc)}))
更新這條記錄的方式。
寫在最后但是很重很重要(Last But Not Least)
知乎有一句話說的好
先問是不是,再問為什么