表現力とメタプログラミング
Python風だが、Pascal/Ada系でもある
インデントによるブロック、簡潔なif、for、シーケンス操作はPython経験者にも読みやすい一方、proc、type、object、enum、distinct、range型はPascal、Ada、Modulaの影響を強く受けています。
Nimの識別子は、通常、先頭文字以外の大文字小文字とアンダースコアを区別しません。C系・Python系の命名規則をつなぐ際には便利ですが、チームでは命名規約を決める価値があります。
UFCS・ジェネリクス・concept
自由関数をメソッド風に呼べます。
ジェネリクスとconceptは、型パラメータと制約による再利用を可能にします。
Nimのtype class/conceptはJavaやC#のクラスではなく、ジェネリック制約に近い概念です。オーバーロード、テンプレート、マクロなど複数の抽象化手段があるため、公開APIの設計では一貫性を意識します。
ASTを扱うマクロ
Nimの差別化要因はコンパイル時メタプログラミングです。マクロは文字列置換ではなくASTを受け取り、変換して返します。
import macros
macro debug(expr: untyped): untyped =
result = quote do:
echo `expr`.astToStr, " = ", `expr`
より軽量な繰り返しにはテンプレートを使えます。
SQL DSL、シリアライザー、RPC、ルーティング、テスト、ORM、パーサー生成に強力ですが、過用すると展開後の構造、IDE、エラーの発生源を追いにくくします。利用者向けには展開後の振る舞いとデバッグ方法も示しましょう。