はじめに
Nimはいろんな書式で書くことができるけど、標準ライブラリでは決まったコードスタイルに従う方が良いです。
でもここで書いてることが全てじゃないし今後変わっていきます。
Pythonのスタイルガイドが変わっていくのと一緒で、このスタイルガイドも変わっていくかも。
ここでのルールは公式のライブラリとかで強制されるものです。
空白
- 1行は80文字に収めるのがいいです。そうすることでリーダが処理するチャンクを小さくすることができます。
- タブはエディタの設定で幅が変わってしまうので、ブロックのインデントは2スペース統一する。タブは使用しない。
- 下記のコードのように見た目を良くするための空白は文法上は問題ないですが、自動フォーマットされるかはエディタによってかわるのであまり好ましくないです。
# 新しい行を増やすたびに全行を修正する必要が出てくる
type
WordBool* = int16
CalType* = int
... # 5 lines later
CalId* = int
LongLong* = int64
LongLongPtr* = ptr LongLong
命名
- ここで書かれている命名規則は現時点でのものです
以前は基本型をプリフィクス(pointerはP, valueはT, ExceptionはEなど)にしたPascalCaseに従っていたので、その命名が残っているところが多くありますが、それらは今後変更される予定です
型の定義はPascalCaseで記述します
その他はcamelCaseで宣言してください
定数はPascalCaseを使うことがあるかもですが必須ではないです。
# 定数はキャメルケースとパスカルケースの両方が使えます
const aConstant = 42
const FooBar = 4.2
# 変数はキャメルケースで、小文字で始める必要があります
var aVariable = "Meep"
# 型定義はパスカルケースである必要があります
type
FooBar = object
c++のラッパーでは定数が全て大文字になりますが、読みづらいので好ましくありません
よく使われる型では通常の名前を使用し、使用頻度の低いものはオブジェクトならObj, ポインタであればRefやPtrをサフィックスにつけます
type
Handle = object # 頻繁に使われる型
fd: int64
HandleRef = ref Handle # あまり使われない型
- ExceptionにはErrorというサフィックスをつけます
type
UnluckyError = object of Exception
- pureで宣言していない列挙型には型がわかるような省略形などのプリフィクスをつけます
type
PathComponent = enum
pcDir
pcLinkToDir
pcFile
pcLinkToFile
- pureで宣言した場合は、パスカルケースにします
type
PathComponent {.pure.} = enum
Dir
LinkToDir
File
LinkToFile
- HTTP, URL, TCPなど大文字で扱われることが多い単語も現実で使われるような単語を使用します
parseURL # Bad
parseUrl # Good
checkHTTPHeader # Bad
checkHttpHeader # Good
コーディング
- プロシージャで戻り値を返す場合は、あらかじめ用意されているresult変数を使います。これにより可読性が上がります
proc repeat(text: string, x: int): string =
result = ""
for i in 0 .. x:
result.add($i)
複数行になるステートメント
- タプルの宣言が複数行になる場合、上の行の要素とインデントを合わせます
type
LongTupleA = tuple[wordyTupleMemberOne: int, wordyTupleMemberTwo: string,
wordyTupleMemberThree: float]
- プロシージャの宣言も同様です
type
EventCallback = proc (timeReceived: Time, errorCode: int, event: Event,
output: var string)
proc lotsOfArguments(argOne: string, argTwo: int, argThree: float
argFour: proc(), argFive: bool): int
{.heyLookALongPragma.} =
- 呼び出し時も同様
startProcess(nimExecutable, currentDirectory, compilerArguments
environment, processOptions)