LoginSignup
16
10

More than 5 years have passed since last update.

nim code style まとめ

Posted at

はじめに

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)
16
10
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
16
10