Bozhidar Batsov氏によるClojureスタイルガイドを日本語訳しました。
Clojureスタイルガイド https://totakke.github.io/clojure-style-guide/
GitHubで管理されているコミュニティベースのコーディング規約集です。例も豊富でわかりやすいため、Clojurianは一度目を通しておくことをおすすめします。
本翻訳版もGitHubで管理されています。
totakke/clojure-style-guide https://github.com/totakke/clojure-style-guide
翻訳に関する指摘や修正は、IssueやPull Requestを作成してもらえれば、適宜修正を行っていきます。なお、スタイル自体への意見は原文プロジェクトにお願いします。
- 原文プロジェクト: bbatsov/clojure-style-guide
- 原著作者: Bozhidar Batsov
以下にスタイルガイドの一部を紹介します。全文は Clojureスタイルガイド をご覧ください。
サンプル
-
各インデントには スペース を使う。タブは使わない。[リンク]
-
letの束縛とマップのキーワードを揃える。[リンク];; 良い (let [thing1 "some stuff" thing2 "other stuff"] {:thing1 thing1 :thing2 thing2}) ;; 悪い (let [thing1 "some stuff" thing2 "other stuff"] {:thing1 thing1 :thing2 thing2}) -
複数行にわたるドキュメント文字列はインデントする。[リンク]
;; 良い (defn foo "Hello there. This is a multi-line docstring." [] (bar)) ;; 悪い (defn foo "Hello there. This is a multi-line docstring." [] (bar)) -
1行が80文字を超えないようにする。[リンク]
-
行末の空白を避ける。[リンク]
-
名前空間ごとにファイルを分ける。[リンク]
-
全ての名前空間は、複数の
refer,require,importからなるnsフォームで始める。順序は慣習的にrefer,require,importの順とする。[リンク](ns examples.ns (:refer-clojure :exclude [next replace remove]) (:require [clojure.string :as s :refer [blank?]] [clojure.set :as set] [clojure.java.shell :as sh]) (:import java.util.Date java.text.SimpleDateFormat [java.util.concurrent Executors LinkedBlockingQueue])) -
関数本体内では、コンディションマップによる入力値、出力値のチェックがより良い。[リンク]
;; 良い (defn foo [x] {:pre [(pos? x)]} (bar x)) ;; 悪い (defn foo [x] (if (pos? x) (bar x) (throw (IllegalArgumentException "x must be a positive number!"))) -
シーケンスが空かどうかをチェックするには
seqを使う(このテクニックはしばしば nil punning と呼ばれる)。[リンク];; 良い (defn print-seq [s] (when (seq s) (prn (first s)) (recur (rest s)))) ;; 悪い (defn print-seq [s] (when-not (empty? s) (prn (first s)) (recur (rest s)))) -
predやcollのような慣習名にはclojure.coreの例が参考になる。[リンク]- 関数内では、
-
f,g,h- 関数入力 -
n- サイズを示す整数値 -
index,i- 整数のインデックス -
x,y- 数値 -
xs- シーケンス -
m- マップ -
s- 文字列入力 -
re- 正規表現 -
coll- コレクション -
pred- 述語クロージャ -
& more- 可変長引数 -
xf- xform、transducer
-
- マクロ内では、
-
expr- 式 -
body- マクロ本体 -
binding- マクロの束縛ベクタ
-
- 関数内では、
などなど。
詳しくは Clojureスタイルガイド へ。