Clojureの書き方の慣習まとめ.

個人的な思想としてコーディング規約は人間がチェックするものではなくlinterやformatterを使って自動整形すべきだと思う.

Clojureファイル名

💡Clojureのファイル名はアンダースコアでnamespaceはハイフン

Javaとの互換性の都合でClojureのファイル名でハイフンは使えない. アンダースコアで書く必要がある. しかし, namespaceはハイフンをつかう.

💡Clojureのアンダースコア2つは使えない

💡Clojureのファイル名はアンダースコアでnamespaceはハイフンと同様に, Javaからの縛りのようだ. 実際, classファイルが見つかりませんとエラーした.

テストファイルなどxxx_testとなることが多く, すなわちテストを前提としたらハイフンすら使わないほうがいいということになる.

Clojure スタイルガイド

Clojureスタイルガイド が大変参考になる. あとはGitHubで他人のコードリーディング.

このスタイルが実質Clojure界隈でデファクトスタンダードになっていて, いろんなリポジトリを覗いてもこれに従って書かれている.

ここにはとりあえず身につけたい努力目標をメモしていく. 本当はスタイルとかは個人の努力に頼るのはアンチパターンでツールでチェックするのがいい.

日本語訳は更新が反映されていないことがあるので, GitHubの最新版を参照したほうがいいかも.

関数名や変数名は kebab-case aka. lisp-case

ref: https://totakke.github.io/clojure-style-guide/#lisp-case

🔖kebab-case

別の命名規約との変換のライブラリとして, Clojureでは camel-snake-kebab というものが有名.

https://github.com/clj-commons/camel-snake-kebab

マイクロサービス開発だと, 各言語によって変数名が異なるので変換が必要.

Clojureで作ったAPIをマイクロサービスの海に隠す - ayato-p

Protocols/Records/Structs/TypesはPascalCase

ref: プロトコル、レコード、構造体、型はCamelCaseで

🔖PascalCase

private functionsには defn- で印をつける

ref: https://totakke.github.io/clojure-style-guide/#private

副作用の持つ関数は!, 変換をする関数の名称はtoではなく->

e.g.) reset!

Java Classでパフォーマンスが下がったら^でType Hintsをつける

reflection抑止によるコンパイル速度向上.

ref: https://clojure.org/reference/java_interop#typehints

どちらかというと,使うなという意味だな🤔

Normally, one should avoid the use of type hints until there is a known performance bottleneck.

リフレクションってなに?と思ったら過去記事を書いてた…

🖊Java のリフレクションでインスタンスやメソッドを動的生成する | Futurismo

定数に特別な表記をしない

JavaとかPythonで定数を大文字にする慣習は注意. Clojureでは全てが定数なので不要.

(def MAX-SIZE 10) ; Java style NG!!!

🤔名前空間やファイル名は単数か複数か問題

基本的には単数系だと思っていたけれども複数系で使っているケースもあったので調べてみた(example). ちなみにPluralが複数形, singlarが単数系の検索ワード.

Javaからの流れでnamespaceがドメインやクラスと対応するように考えると単数なのかなと思いこんでいた. 一応conventions的な制約はないようだ. 引き続きサンプル収集をして追記する.

この話題に関しては, Javaのpackageの命名問題で検索するとより情報がでてくる. 言語の制約ではなくこれは設計の問題. Javaのクラスには Collections (Java Platform SE 7 ) のように複数系をもつネイティブなクラスも存在する.

まあ統一感がありわかりやすければなんでもいいかも.

see also. 📝Clojure: 名前空間のスタイルガイド

💡複合語のファイル名はアンダースコアのsnake_case

Clojureの世界は基本的にはkebab-caseなものの, ファイル名についてはsnake_caseにしないとnamespaceをロードできない, エラーする.

これはJavaとのInteropの問題が絡んでいてそういうものなのかも.

What are Clojure’s Naming Conventions? - Stack Overflow

しかしそれよりも複合語を避けて, つまり_をつかうような名前を避けることがbetter.

Better Clojure formatting

alternative to Clojure Style Guide.

Better Clojure formatting @ tonsky.me

References