2012-02-23 38 views
2

局部變量與函數變量具有相同含義的約定是什麼?局部變量與函數變量具有相同含義的約定是什麼?

如果我需要局部變量有作爲函數參數的初始狀態值(並因此具有相同的意思),我應該怎麼稱呼呢?

人造例子(然而,這表明Clojure中頗爲流行的建築):

(defn sum [coll] 
    (loop [local-coll coll, result 0] 
    (if (empty? local-coll) 
     result 
     (recur (rest local-coll) (+ (first local-coll) result))))) 

這裏local-coll初始化爲coll的價值進行初始和循環過程中它也擁有這個意思。 local-coll絕對不是一個好名字,但是什麼?

在Haskell中,將報價(')放在變量/函數名稱末尾是一種很好的風格,例如, var'。在Common Lisp中,有時我看到以星號結尾的名字(*)。 Clojure具有與函數相同的符號,它們重複了另一個函數含義,但具有不同的語義(例如list*)。但是這種表示法在文檔字符串中也經常用來表示可能有多個這種類型的項目(例如(methodname [args*] body)*(try expr* catch-clause* finally-clause?)),因此在用於本地var名稱時可能會產生混淆。 Java interop還提供諸如defn-之類的名稱,即以連字符結尾的名稱(-)以指示生成的類中的私有方法。因此,使用連字符作爲本地(私有函數)變量也是有意義的(儘管它對我來說似乎有點奇怪)。

那麼,當我的局部變量與函數參數具有相同的含義時,我該怎麼辦?

回答

8

我認爲這是罰款陰影參數名時不需要原始的參​​數更多:是我見過

(defn sum [coll] 
    (loop [coll coll, result 0] 
    (if (empty? coll) 
     result 
     (recur (rest coll) (+ (first coll) result))))) 

其他變化:

(loop [c colls] ...) 
(loop [coll initial-coll] ...) 
(loop [foo foo-coll] ...) 
(loop [s specs] ...) 
相關問題