您的当前位置:首页F周刊:2017-03-27

F周刊:2017-03-27

2024-12-10 来源:哗拓教育

对于初学者非常有益的文章,即便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))))))
显示全文