2012-02-23 5 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は間違いなく良い名前ですが、何ですか?

ハスケルでは、変数/関数名の最後に引用符(')を入れると良いスタイルです。 var'。 Common Lispでは時々、アスタリスクで終わる名前が見えました(*)。 Clojureは関数と同じ表記法を持ちますが、別の関数の意味は同じですが、意味が少し異なります(例えばlist*)。しかし、この表記法は、このタイプの項目がいくつかあることを示すためにdocstringで頻繁に使用されます(例:(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] ...) 
関連する問題