LoginSignup
69
66

More than 3 years have passed since last update.

Clojureスタイルガイド(日本語版)

Last updated at Posted at 2013-08-01

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を作成してもらえれば、適宜修正を行っていきます。なお、スタイル自体への意見は原文プロジェクトにお願いします。


以下にスタイルガイドの一部を紹介します。全文は 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))))
    
  • predcollのような慣習名にはclojure.coreの例が参考になる。[リンク]

    • 関数内では、
      • f, g, h - 関数入力
      • n - サイズを示す整数値
      • index, i - 整数のインデックス
      • x, y - 数値
      • xs - シーケンス
      • m - マップ
      • s - 文字列入力
      • re - 正規表現
      • coll - コレクション
      • pred - 述語クロージャ
      • & more - 可変長引数
      • xf - xform、transducer
    • マクロ内では、
      • expr - 式
      • body - マクロ本体
      • binding - マクロの束縛ベクタ

などなど。

詳しくは Clojureスタイルガイド へ。

69
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
66