2009-12-15 64 views
3

http://pastebin.com/d2294a374這個Clojure代碼是否正確縮進?

我已經發布了以2種不同的方式縮進的代碼。我在這裏感到困惑,因爲我不確定當一個函數有多個參數時該怎麼做。每個參數應該在不同的線上還是相同?此外,當我們有這樣的事(DEF XYZ(FN ABC [A1 + A2] ...沒有(FN ABC ......在不同的線路走?

我讀從http://mumble.net/~campbell/scheme/style.txt以下,但事實並非如此似乎多大意義,我。

**縮進和對齊

任何形式的操作者,即,下面的開口 輪支架上的第一窗體,確定用於縮進或對準剩餘 形式的規則在這個位置的許多名字表示特殊的 對齊或縮進規則;這些是具有特定參數結構的特殊運算符,宏或 過程。

如果首體是一個非特殊的名字,然而,然後如果第二 子窗體是在同一行,對齊所有以下 子窗體的起始列與第二子窗體的。如果第二個子窗體位於以下行的 上,請將其起始列與第一個子窗體 的起始列對齊,並對所有其餘子窗體執行相同的操作。

一般來說,Emacs會正確縮進Lisp代碼。在任何代碼上運行`C-M-q' (indent-sexp)以確保其正確縮進,並且 配置Emacs,以便適當縮進任何非標準窗體 。

不可接受:

(+ (sqrt -1) 
    (* x y) 
    (+ p q)) 

(+ 
    (sqrt -1) 
    (* x y) 
    (+ p q)) 

可接受:

(+ (sqrt -1) 
    (* x y) 
    (+ p q)) 

(+ 
(sqrt -1) 
(* x y) 
(+ p q)) 

理由:柱狀對準允許讀者遵循任何操作的 操作數直截了當,簡單地通過掃描 向下或向上以匹配共同的專欄。縮進規定 結構;混淆縮進是希望 派生結構而不手動匹配括號的讀者的負擔。

+0

的引擎收錄死亡。 – 2012-11-25 05:04:38

回答

10

如果參數在多行上(例如因爲它們不適合在一行上),它們應該都具有相同的縮進。如果你把第一個參數上一個新的生產線,這縮進應該是一個更深層次的(例如,2位),比本身的功能:

(foo (bar (baz 
      arg1 
      arg2))) 

如果你把第一個參數在同一行的功能,剩下的應該有相同的縮進:

(foo (bar (baz arg1 
       arg2))) 

我縮進舉例如下:

(defn get-neighbors [[x y] v] 
    (for [y1 (range (dec y) (+ y 2)) 
     x1 (range (dec x) (+ x 2)) 
     :when (and (not (and (= x1 x) 
          (= y1 y))) 
        (in-bounds? x1 y1 v))] 
    ((v y1) x1)))