スタイル、規則、効率などの観点から、Clojureで定数を定義するためのベストプラクティスは何ですか。
たとえば、これは正しいですか?
(def *PI* 3.14)
質問:
Clojureでは定数を大文字にする必要がありますか?
様式的には、片側または両側にアスタリスク(*)文字を付ける必要がありますか?
知っておくべき計算効率の考慮事項はありますか?
から http://dev.clojure.org/display/community/Library+Coding+Standards :
イヤーマフは、再バインドを目的としたものにのみ使用してください。 定数に特別な表記を使用しないでください;特に指定がない限り、すべてが定数と見なされます。
厳格なルールはないと思います。私は通常、彼らに特別な扱いをまったくしません。関数型言語では、物事はより純粋であることが多いため、定数と他の値の区別はほとんどありません。
両側のアスタリスクは、Clojureでは「イヤーマフ」と呼ばれます。これらは通常、「特別な」変数、または後でバインディングを使用して動的にリバウンドされる変数を示すために使用されます。 outやinのようなもので、ユーザーによって異なるストリームにリバウンドされることがありますなどが例です。
個人的には、pi
という名前を付けます。 Clojureで人々が定数に特別な名前を付けるのを見たことがないと思います。
編集:カーパー氏は、他の言語の慣習であるため、彼自身がコード内の定数を大文字にしていることを指摘しました。これは、少なくとも何人かの人々がそれをしていることを示していると思います。
コーディング標準 をざっと見ましたが、何も見つかりませんでした。これは、あなたがそれらを資本化するかどうかは本当にあなた次第であると私に結論を導きます。長期的には誰もあなたを平手打ちすることはないと思います。
計算効率の面では、Clojureにはグローバル定数のようなものはないことを知っておく必要があります。上記にあるのはvarであり、それを参照するたびにルックアップを実行します。イヤーマフを付けなくても、変数は常にリバウンドできるため、値は常に変化する可能性があるため、常にテーブルで検索されます。パフォーマンスが重要なループの場合、これは明らかに最適ではありません。
重要なループの周りにletブロックを配置し、「定数」変数の値を許可して、それらが検索されないようにするなど、いくつかのオプションがあります。または、定数値がコードにコンパイルされるように引数なしマクロを作成します。または、静的メンバーを使用してJavaクラスを作成することもできます。
詳細については、この投稿と定数に関する次の説明を参照してください。
イヤーマフは、特定のシンボルが、ある時点で独自のthread-localバインディングを持つことを示す方法です。そのため、イヤーマフを円周率定数に適用することは意味がありません。
*clojure-version*
はClojureの定数の例であり、完全に小文字です。
定数に特別な表記を使用しないでください。特に指定がない限り、すべてが定数と見なされます。
http://dev.clojure.org/display/community/Library+Coding+Standards を参照してください。
Common LISPでは、定数にプラス記号(+my-constant+
)を付けて命名する規則があり、Schemeでは、ドル記号($my-constant
)を前に付けるという規則があります。 このページ を参照してください。このような規則は、他の回答にリンクされている公式のClojureコーディング標準と競合しますが、通常の変数を:const
属性で定義されたものと区別するのが妥当かもしれません。
あらゆる種類の非関数変数に何らかの特徴的な機能を与えることには利点があると思います。関数を保持するために定義された変数を除いて、通常は関数パラメーター、let
などで定義されたローカル名のみを使用するとします。それでも、def
を使用して非関数変数を定義する場合は、その名前は同じファイルの関数定義に表示され、ローカル変数のように見えます。関数が複雑な場合は、関数内の名前定義を探すのに数秒かかる場合があります。変数の使用に応じて、イヤーマフ、プラス記号、またはすべて大文字などの識別機能を追加すると、変数の定義が別の場所にあることが明らかになります。
さらに、piのような特別な定数に特別な名前を付けるのには十分な理由があるため、pi
が「print-index」、i番目のピザ、「preserved」のいずれを意味するのか疑問に思う必要はありません。インターフェース"。もちろん[〜#〜] i [〜#〜]は、これらの変数にはもっとわかりやすい名前を付ける必要があると考えていますが、多くの人は不可解な短い変数名を使用しています、そして私は彼らのコードを読むことになります。 pi
が円周率を意味するかどうか疑問に思う必要はないので、PI
のようなものが理にかなっているかもしれません。それがClojureのミル変数の実行だとは誰も思わないでしょう。
Clojureには、次のようなさまざまなリテラルがあります。
3.14159
:point
{:x 0
:y 1}
[1 2 3 4]
#{:a :b :c}
リテラルは一定です。私の知る限り、新しいリテラルを定義する方法はありません。新しい定数を使用する場合は、コンパイル時にコードでリテラルを効果的に生成できます。
(defmacro *PI* [] 3.14159265358979323)
(prn (*PI*))
「PracticalClojure」の本によると、*pi*
という名前にする必要があります