學習 Clojure/編碼規範
外觀
因為 Clojure 程式碼只是一堆字面量,如果不以可讀的風格縮排,就很難閱讀。格式良好的 Clojure 看起來像這樣
(defn my-zipmap [keys vals]
(loop [map {}
ks (seq keys)
vs (seq vals)]
(if (and (not-empty ks) (not-empty vs))
(recur (assoc map (first ks) (first vs))
(rest ks)
(rest vs))
map)))
(my-zipmap [:a :b :c] [1 2 3])
這裡的一般想法是,當在多行上展開時,列表或向量的元素應該在下面的行上縮排。注意,以 (loop 開頭的行在 (defn 下縮進了兩個空格,因為以 (loop 開頭的列表是 以 (defn 開頭的列表的直接元素。然而,在這之下,作者透過選擇將 (recur 與上面的 (and 對齊而不是從 (if 縮排兩個空格來打破了這條規則。還要注意,以 [map 開頭的向量從其行內部開始,所以下面兩行繼續該向量的對齊方式正好在開頭的 [ 的右邊。規則是
- 將續行縮排 2 個空格...
- 除非有機會對齊開頭的 (, [, 或 { 字元...
- 或者除非繼續內部字面量。
本質上,總是縮排到屬於 (, [, 或 { 的元素之下。誠然,這種方案確實需要一些時間來適應,無論是閱讀還是編寫。
在 Lisp 中,你經常會遇到很多尾隨括號,這是非常典型的
(defn supply-arg [arg flist]
(loop [flist flist cnter 0]
(if (first flist) (do ((first flist) arg)
(recur (rest flist) (+ 1 cnter)))))) ; remember, the + in this line is just an ordinary symbol
像 Emacs 這樣的文字編輯器可以幫助你處理括號匹配和縮排風格。