Posted at

nim code style まとめ

More than 1 year has passed since last update.


はじめに

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)