比方說:
(= 0 x) 就會被 kibit 建議改成 (zero? x)
我一時興起,下載了 kibit 的 source code 來研究之後,腦子裡立刻充滿了一大堆問號。經過歸納之後,我把這些自己問自己的問題,歸納了一下。首要的問題,當然是「kibit 是如何實現的?」
這個問題可以拆解成下列的幾個問題:
(1) 我們寫的程式碼,是如何被 kibit 讀入,以什麼樣的資料型態儲存?
clojure 的 source code 被 kibit 讀入之後,刻意以 unevaluated form 的形式,視為是 list 的 data structure ,而不是字串。之後,就用 tree-seq 將 list expression 拆解成「子樹」,即 sub form 。
(2) kibit 裡的 rules 是怎麼呈現的?
kibit 裡的 rules 可以寫成 vector 的形式。比如: [(= 0 ?x) (zero? ?x)]
其中, ?x 的部分,是可以用來做 binding 的部分。
(3) 用什麼 library 來做「模式比對」?
使用 core.logic 這個 library 來做 unification
就我個人的看法,其實沒有使用 core.logic 大部分的功能,所以如果改寫的話,說不定可以用 core.unify 來替代掉。
這邊一句話簡單介紹一下 core.unify 這個 library 主要的功能: unification
Unification is the process of taking two expressions and substituting all of the variables with matching concrete expressions.
範例:
(unify/unify '(= 0 aa) '(= 0 ?x))
;; => {?x aa}