エラー処理・並行処理・NimScript
例外と効果
Nimでは例外が標準的なエラー処理の一つです。
try:
echo parseInt("abc")
except ValueError as error:
echo error.msg
proc parseValue(text: string): int {.raises: [ValueError].} =
parseInt(text)
raisesプラグマで投げ得る例外を制限できます。例外、IOなどの副作用タグ、ロックレベル、GC安全性を記述・検査する効果システムもあります。一方、言語全体がRustのResult[T, E]のような代数的エラー型を中心に作られているわけではありません。
非同期・スレッド
Nimはスレッド、非同期IO、チャネル、スレッドプールを扱えます。
import std/[asyncdispatch, asyncnet]
proc main() {.async.} =
let socket = newAsyncSocket()
await socket.connect("example.com", Port(80))
waitFor main()
async/awaitはコンパイル時変換を活用します。ARC/ORCは非atomic reference countingを中心とするため、参照型をスレッド間で自由に共有する前提ではありません。所有権、メッセージパッシング、スレッドローカルなデータ構造を意識して設計します。
NimScript
NimScriptはビルド、テスト、デプロイ、ベンチマーク、ドキュメント生成などに使えるスクリプト実行形態です。
# build.nims
task build, "Build the application":
exec "nim c -d:release src/app.nim"
task test, "Run tests":
exec "nimble test"
ネイティブアプリケーション、ライブラリ、コンパイル時処理、ビルドスクリプトを、近い言語感覚で扱えることがNimの強みです。