generated at
Nimのデータ型
from Nim
Nimのチュートリアルにだいたい書いてある
けれどメモしておきたいような細かいのとか

固定長配列
固定長なので長さを変更できない
つまり要素を追加したり削除したりできない
配列の長さも型情報に含まれる
よって以下のコードはコンパイルエラーになる
array.nim
var arr = [1, 2, 3] arr = [1, 2] echo arr
$ nim c -r array.nim
> array.nim(2, 5) Error: type mismatch: got <array0..1, int> but expected 'array0..2, int'
長さが同じならコンパイルが通る
array2.nim
var arr = [1, 2, 3] arr = [2, 3, 4] echo arr
ちなみに末尾の要素に , が残っていてもコンパイルエラーにはならない
2の後ろに , があるがコンパイルが通る
seqも同様
array.nim
var arr = [ 1, 2, ] echo arr

可変長配列
他の言語ではリスト、スライスとかいわれたりする
要素の追加、削除が可能
要素の長さが異なる状態での再代入も可能
よく使うseqを操作するモジュールはsequtilsalgorithm
@ を使って宣言する
nim
var seq1 = @[1, 2, 3] var seq2: seq[int] = @[1, 2, 3]
後ろから何文字目というアクセスの仕方もできる
pythonでいう [1, 2, 3][:-1] というやつ
nim
echo "hello world"[6..^1] # -> world echo "hello world"[^1] # -> d

arrayとseq両方とマッチする特殊な型
openArray[string] みたいに書く
sample.nim
proc total(n: openArray[int]): int = for i in n: result += i
プロシージャの引数にしか指定できない
プロシージャの戻り値には指定できない
ネストしたopenArrayは指定できない
openArray[openArray[string]] はコンパイルエラーになる
あきらめて seq[seq[string]] と書く

複数値を返す型
オブジェクトの定義を省略していきなり宣言できる
これかなり嬉しい
また、タプルの時はそれぞれ別の変数として代入することもできる
tuple.nim
proc newTuple(): (string, string) = return ("hello", "world") let t = newTuple() echo t # -> ("hello", "world") echo t[0] # -> hello echo t[1] # -> world # 複数に変数にそれぞれ代入できる let (h, w) = newTuple() echo h # -> hello echo w # -> world

他の言語では連想配列、ハッシュマップ、辞書型とかいわれたりする
テーブルって名前は他の言語だとあまり聞かなくてググってもヒットしなくて苦労した
tablesモジュールのimportが必要
nim
import tables var a = {"hi": 1, "there": 2}.toTable echo a["hi"], " ", a.len assert a.hasKey("hi") for key, value in a: echo key, " " ,value