对于初学者非常有益的文章,即便Clojure不是你的菜,这篇文章也可以帮助你了解函数式编程的若干应用,尽管不是那么系统。至于为何Clojure值得一学,窃以为:
- Lisp系 => 函数式编程 => 高逼格
- 植根JVM,背靠大树好乘凉,可以利用现有的大量的成熟资产
- 高并发,这一点有点说得太滥了
- 简洁,否则图啥?
要说学习曲线,确实不低,但一旦学成,你会看到另一片风景。再说,君不见几个小语种其实非常吃香吗?
最后说一下我现在用的配套工具
- ,可以算得上是Clojure下的Gradle,入乡需随俗。
- IDE,VSCode + 插件,还不错。
- ,有文档有例程,赞!
2016年的Clojure调查汇总,我最关心的就是后半部的若干工具和环境。至于前面的,肯定是“形势一片大好”,看不看无所谓。
要说Clojure好学,不是炫耀智商,就是虚假广告。咱们普通人还是多看例子为佳!
在用Json/Jsonb之前,先读这两篇文章。简单的总结如下:
- jsonb的性能虽好过json,但也是用空间换时间的老套路
- jsonb配合GIN索引,可以实现更灵活的查找
- jsonb在获得灵活性的同时,也有其自身的问题:
- 空间成本,不适合频繁更新的列,因为MVVC的机制原因,修改其实都是新增
- 难以被PG统计,故对于查询优化器贡献甚微
跟上面推荐的两个链接类似,此文讲的是NUMBERIC的问题。由于类似Oracle中的Number类型,有Oracle经验的人都会对它有感情,但它并非万灵药。原因无外乎性能二字。
文章本身很简单,但其中提到几个知识点适合PG的初学者:
- 如何获得表大小
- 如何用pgbench来做性能测试
干巴巴的设计规范很容易让人过眼即忘,一篇生动的案例教学就不一样了。
最后,来一段遗传算法版的“Hello World” Clojure代码让大家体验一下用它写应用的感觉。它的大体算法是先从字母表随机生成一段字符串,然后一次改变一个字符,最终进化成“Hello World!”字符串。
(ns myga.core)
(def geneSet " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!.")
(def target "Hello World!")
(defn generate-parent
[length]
(apply str (take length (shuffle (seq geneSet)))))
(defn get-fitness
[guess]
(count (filter identity (map = target guess))))
(defn mutate
[parent]
(let [i (rand-int (count parent))
new-genes (take 2 (shuffle (seq geneSet)))
new1 (nth new-genes 0)
new2 (nth new-genes 1)]
(if (= (nth parent i) new1)
(str (subs parent 0 i) new2 (subs parent (inc i)))
(str (subs parent 0 i) new1 (subs parent (inc i))))))
(defn display
[guess]
(println (format "%s\t%d" guess (get-fitness guess))))
(defn children
([] (children (generate-parent 12)))
([parent]
(if (= parent target)
(lazy-seq (cons parent (children parent)))
(loop [child (mutate parent)]
(if (> (get-fitness child) (get-fitness parent))
(lazy-seq (cons parent (children child)))
(recur (mutate parent)))))))
(defn -main
[& args]
(let [generation (take 13 (children))]
(loop [current 1
current-element (nth generation current)]
(display current-element)
(if (= current-element target)
target
(recur (inc current) (nth generation current))))))