基本構文とステートメント
Nimはインデントでブロックを表します。Python風に見える部分がありますが、proc、type、objectなどはPascal/Ada系の影響も持ちます。
値、変更、定数
let name = "Nim" # 再代入しない束縛
var count = 0 # 変更可能な束縛
const bufferSize = 4096 # コンパイル時定数
count += 1
echo name, ": ", count
基本はlet、状態更新が必要なときだけvar、コンパイル時に確定する値にはconstを使います。型は多くの場合に推論されますが、API境界では明示した方が読みやすく安全です。
プロシージャと戻り値
proc greet(name: string): string =
"Hello, " & name & "!"
proc maximum(left, right: int): int =
if left > right: left else: right
echo greet("Nim")
echo maximum(3, 7)
procでプロシージャを定義します。最後の式を戻り値にでき、resultへ代入して戻すこともできます。引数はセミコロンでグループ化できます。
条件分岐と繰り返し
let value = -2
if value > 0:
echo "positive"
elif value < 0:
echo "negative"
else:
echo "zero"
for number in 1..5:
if number mod 2 == 0:
echo number, " is even"
var index = 0
while index < 3:
echo index
inc index
ifは文としてだけでなく式としても使えます。forは範囲やイテレータを処理し、1..5は終端を含み、0..<5は終端を含みません。while、break、continueも通常の制御構文として利用できます。
型とデータ
type
Status = enum pending, running, completed
Article = object
title: string
tags: seq[string]
let article = Article(title: "Nim", tags: @["language", "native"])
echo article.title
enumは列挙、objectは構造化データ、seq[T]は可変長シーケンスです。@[]はシーケンスリテラルです。型の詳細は型システムとメモリ管理で扱います。
モジュール
別ファイルの公開シンボルは末尾の*で公開し、利用側でimportします。
標準ライブラリはimport std/[strutils, sequtils]のように読み込みます。プラットフォーム差はwhen defined(js)の条件コンパイルで分けられます。
次へ
小さなCLIやライブラリを作ったら、型システムとメモリ管理、コンパイル時プログラミング、バックエンドとFFIへ進みます。正確な構文とバージョン固有の意味論は公式マニュアルで確認してください。