跳轉到內容

學習 Clojure/編碼規範

來自 Wikibooks,開放書籍,開放世界

因為 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 開頭的向量從其行內部開始,所以下面兩行繼續該向量的對齊方式正好在開頭的 [ 的右邊。規則是

  1. 將續行縮排 2 個空格...
  2. 除非有機會對齊開頭的 (, [, 或 { 字元...
  3. 或者除非繼續內部字面量。

本質上,總是縮排到屬於 (, [, 或 { 的元素之下。誠然,這種方案確實需要一些時間來適應,無論是閱讀還是編寫。

在 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 這樣的文字編輯器可以幫助你處理括號匹配和縮排風格。

Previous page
基本語法
學習 Clojure Next page
函數語言程式設計
編碼規範
華夏公益教科書