2009-02-12 194 views
36

其中一位花時間評論關於Clojure/LISP語法的my other question的人指出,我沒有用標準的LISP方式編寫我的示例代碼。所以他很友善地重寫代碼片段,這是一個很大的幫助。但在我的腦海裏又提出了另一個問題。爲什麼會這樣:Lisp代碼格式

(if (= a something) 
    (if (= b otherthing) 
    (foo))) 

該標準是LISP格式是preferrable這種形式:

(if (= a something) 
    (if (= b otherthing) 
    (foo) 
) 
) 

這是我會天真地格式化,因爲我的C++的開發背景這段代碼的方式。我想知道後者的格式是否有好處,或者它只是一個根深蒂固的標準(如QWERTY鍵盤)。我不想爭論 - 我很難理解爲什麼第一種形式更可取。第二種形式可以幫助我更容易地看到代碼結構。

+0

而不是

(if (= a something) (if (= b otherthing) (foo))) 
你可能要考慮
 (when (and (= a something) (= b otherthing)) (foo)) 
jlf 2009-05-11 21:11:38

回答

37

多餘行上的右括號並不能真正幫助您查看代碼的結構,因爲您可以從縮進級別獲取相同的信息。但是,第二種形式幾乎佔用了兩倍的行數,迫使您在閱讀代碼時更頻繁地進行滾動。

如果您需要更仔細地檢查嵌套圓括號,則突出顯示匹配圓括號的編輯器將對您有所幫助。當匹配的圓括號不太遠時,這也會更容易。

如果表達式變得太長且複雜而不易讀取,那麼也可能表示您應該將部分功能提取到單獨的函數中。

0

當你有10個括號關閉時,它變得非常笨重。

當我用Lisp語言編程,我離開了右括號之間的空間在同一條線上,其餘開括號,爲了簡化計算,像這樣:

 
(if (= a something) 
    (if (= b otherthing) 
    (foo))) 

我想這些天,沒有更長的時間需要,因爲編輯更有幫助。

+1

我認爲這是一個有用的約定;我必須嘗試一下。它可以在頻繁編輯的情況下真正幫助您處理代碼,因爲您可以看到線條分割的位置。 – Aaron 2009-02-13 23:45:11

+0

真是可怕的建議。 – 2009-02-17 00:17:00

+7

這有什麼可怕的? – starblue 2009-02-17 11:41:44

37

Lisp代碼縮進的方式有點像Python中的重要空白,除了它當然是可選的。基本的經驗法則是,如果項目不在同一行上,則將項目垂直放置在列表中。

(a (b (c (d e) 
     (f g)) 
     (h i j)) 
    (k l m n)) 

看也不看括號,你可以看到(d e)(f g)c(c (d e) (f g))(h i j)參數參數b,和(b (c (d e) (f g)) (h i j))(k l m n)a參數。

(if (= a something) 
    (if (= b otherthing) 
     (foo))) 

    ^^
    notice how they line up 

現在縮進的水平變得有意義,你不再需要依靠平衡括號來獲得這些信息,因爲它是:

你的榜樣,應該更準確地被如下格式化更緊湊的把它們放在結束語句的同一行,這就是lispers所做的。誠然,Lisp代碼不需要這樣格式化,但它是人們使用和可以依賴的相當標準的約定。

3

簡單的答案是,你的方式不是Lisp漂亮的打印機做事情的方式。擁有一個真正的格式對於代碼來說總是一件好事,而pprint宏則爲您提供了該語言內置的格式。

當然,因爲 pprint宏存在,所以你不必嚴格遵守標準的代碼格式,因爲人們可以通過pprint運行你的代碼並獲得他們習慣的東西。但是,由於其他人都使用pprint,或者手動逼近它,如果不以相同的方式進行讀取,您將很難閱讀代碼,並且沒有簡單的宏將他們的代碼轉換爲您的首選格式。

1

您可以使用軟件包Sreafctor:Homepage重新格式化Lisp代碼。

一些演示:

可用命令:

  • srefactor-lisp-format-buffer:格式整個緩衝區
  • srefactor-lisp-format-defun:格式電流defun定義光標在
  • srefactor-lisp-format-sexp:格式化當前sexp光標處於。
  • srefactor-lisp-one-line:將同一級別的當前sexp轉換爲一行;帶有前綴參數,遞歸地將所有內心的兩性變成一條線。

格式化命令也可用於Common Lisp和Scheme。

如果有任何問題,請提交問題報告,我會很樂意解決它。