命名規則
- 関数の小文字のまま
-
ハイフネーションに使用します(他の言語ではアンダースコアまたはキャメルケースになります)。
(defn add-one
[i]
(inc i))
述語(?
例:trueまたはfalseを返す関数)は例で終わります:odd?
even?
nil?
empty?
状態変更手順はで終わり!
ます。覚えてるset!
?またはswap!
リーチに応じて、短い変数名の長さを選択します。つまり、本当に小さな補助変数がある場合は、1文字の名前を使用できることがよくあります。(map (fn [[k v]] (inc v)) {:test 4 :blub 5})
特に多くのコード行で使用され、すぐに目的を推測できない場合は、必要に応じてより長い変数名を選択してください。(私の意見)。
多くのclojureプログラマーは、一般的で短い名前を使う傾向があると感じています。しかし、これはもちろん実際に客観的な観察ではありません。ポイントは、多くのclojure関数が実際には非常に汎用的であることです。
ラムダ関数
空白
(定義短所
[ab]
(リストab))
doc文字列について考える場合、これは理にかなっています。それらは関数名とパラメーターの間にあります。次のドキュメント文字列はおそらく賢明ではありません;)
(定義短所
「ペアリング」
[ab]
(リストab))
- ペアリングを保持している限り、ペアのデータは改行で区切ることができます
(定義f
[{x:x
y:y
グーグー
[abc]:coll}]
(print x "" y "" z "" a "" b "" c))
(,
好きなように入力することもできますが、これはまともな感じではありません)。
インデントには、十分に優れたエディターを使用します。数年前、これはLisp編集のemacsでしたが、vimも今日は素晴らしいです。典型的なclojure IDEもこの機能を提供するはずです。ランダムテキストエディターを使用しないでください。
コマンドモードのvimでは、=
コマンドを使用して適切にインデントできます。
コマンドが長すぎる場合(ネストなど)、最初の引数の後に改行を挿入できます。次のコードはかなり無意味ですが、式をグループ化およびインデントする方法を示しています。
(+(if-let [age(:personal-age coll)]
(if(> age 18)の場合
年齢
0))
(カウント(範囲(-3 b)
(削減+
(範囲b 10))))))
良いインデントは、括弧を数える必要がないことを意味します。括弧はコンピューター用です(ソースコードを解釈し、インデントするため)。インデントは理解を容易にするためのものです。
高階関数for
とdoseq
フォーム
Schemeの背景から来て、私はmap
ラムダ関数などを理解していることをかなり誇りに思っていました。だから非常に頻繁に、私はこのようなものを書くでしょう
(map (fn [[k x]] (+ x (k data))) {:a 10 :b 20 :c 30})
これは非常に読みにくいです。for
フォームは、道のよりよいです:
(for [[k x] {:a 10 :b 20 :c30}]
(+ x (k data)))
`mapには多くの用途があり、名前付き関数を使用している場合は本当に便利です。すなわち
(map inc [12 30 10]
(map count [[10 20 23] [1 2 3 4 5] (range 5)])
スレッドマクロを使用する
スレッドマクロ使用->
と->>
同様にdoto
該当する場合を。
重要なのは、スレッドマクロにより、ソースコードが関数の合成よりも直線的に見えるようになるということです。次のコードは、スレッドマクロがないと非常に読みにくくなります。
(f (g (h 3) 10) [10 3 2 3])
と比べて
(->
(h 3)
(g 10)
(f [10 3 2 3]))
スレッドマクロを使用することにより、通常、1回だけ使用される一時変数の導入を回避できます。
他のもの
- docstringを使用する
- 機能を短くする
- 他のclojureコードを読む