読者です 読者をやめる 読者になる 読者になる

Nim帳

プログラミング言語Nimについて書いていきます。

20160921155215

Nimのデータ型

Nimのデータ型についてです。

基本的なデータ型

Nimの基本的なデータ型としては、

  • int
    • int8
    • int16
    • int32
    • int64
  • uint
    • uint8
    • uint16
    • uint32
    • uint64
  • float
    • float32
    • float64
  • bool
  • char
  • string
  • cstring

などがあります。 先頭にuがついているものはCでいうunsignedで、末尾の数字はビット数を表しています。

コンテナ型

そしてそれらを包含するコンテナ型があります。Nimのコンテナ型はそれぞれが使いやすく、演算子オーバーロードがあり、シンタックスシュガーが用意されているのでとても書きやすいです。

コンテナ型でよく使うものとしては、

  • array
  • seq
  • varargs
  • openarray
  • Table

ちなみに下記の例では分かりやすさのため変数に型を明示的に付けているものもありますが、この程度ならNimのコンパイラ型推論してくれるので省略可能です。

array

arrayは静的配列です。

var arr: array[5, int] = [1, 2, 3, 4, 5]

seq

seqは動的配列です。@をつけることで作成可能です。

var arr: seq[int] = @[1, 2, 3, 4, 5]

varargs

varargsは可変長引数に使います。 ちなみに@をつけることでseqに変換可能です。

proc echoVariadic(args: varargs[int]) =
  echo @args
echoVariadic(1, 2, 3, 4, 5)

さらに、varargsで可変長引数を受け取る際に、任意の変換処理を行うことができます。

proc toInt(value: string): int =
  case value
  of "1":
    return 1
  of "2":
    return 2
  else:
    return 0
proc echoVariadic(args: varargs[int, toInt]) =
  echo @args
echoVariadic(1, 2, "1", "2")

openarray

openarrayは配列を汎用的に扱う型です。
例えば、arrayとseq両方で使える関数を作ったりするのに使えます。

proc echoHead(arr: openarray[int]) =
  echo arr[0]
echoHead([1, 2, 3, 4, 5])
echoHead(@[1, 2, 3, 4, 5])

Table

Tableはハッシュテーブルで、標準ライブラリtablesをimportすることで使えます。
他にも順序が付いたOrderedTableなどもあります。

var agetable = initTable[string, int]()
agetable["genji"] = 35
agetable["hanzo"] = 38
agetable["mercy"] = 37
echo agetable["genji"]

ポインタ型

  • pointer
  • ptr
  • ref

pointer

pointerは生ポインタ型で、Cでいうvoid*です。基本的にはCとの連携の際に使うもので、Nimに閉じたプログラムを書く際に必要になることは無いと思います。

ptr

ptrは型がついたpointerです。これも基本的にはCとの連携の際に使うことが多いでしょう。

ref

refも型がついたpointerなのですが、ptrとrefはGCで管理されるかどうかの違いがあります。
ptrはGCで管理されず、refはGCで管理されます。

まとめ

以上がNimのデータ型でよく使うものです。ただし後半のポインタ型はデータ定義のobjectなどと密接に関係してくるもので、少し分かりにくい説明になったと思います。データ定義などの部分はまた別の記事で書きたいと思います。