Nimの個人的に好きなところ
何が好きかをせっかくなので言語化する
自分について
開発経験
どれくらいNim触ってるか
初めて自作のパッケージをパッケージディレクトリに追加したのが2019/5くらい
bash$ nimble list | grep url | grep jiro4989 | awk '{print $2}'
https://github.com/jiro4989/eastasianwidth
https://github.com/jiro4989/gameoflife
https://github.com/jiro4989/pnm
https://github.com/jiro4989/ski
https://github.com/jiro4989/rect
https://github.com/jiro4989/alignment
https://github.com/jiro4989/nimjson
https://github.com/jiro4989/monit
https://github.com/jiro4989/termnovel
https://github.com/jiro4989/maze
https://github.com/jiro4989/edens
https://github.com/jiro4989/faker
https://github.com/jiro4989/gyaric
https://github.com/jiro4989/envconfig
https://github.com/jiro4989/wave
好きなところ
高速
ネイティブコンパイル
読みやすい
書きやすい
オフサイドルール
C言語式の波括弧でブロックを表現するのだと、ブロックの終了で1行使ってしまう
ディスプレイに表示できる情報量には限りがある
ブロックの終了だけで1行使われるともったいない
タブ文字をインデントに許可しない
インデントに使えるのは半角スペースのみ
割り切っていて良い
タブ文字は嫌い
半角スペース2つが公式に勧められている
好き
テストコード書きやすい
スライスやオブジェクトの比較が ==
でできる
参照型のオブジェクト比較はそのままだと参照の比較になるが、 []
で値型に変換すると値比較できる
すげーーーーー楽
nimtype
ObjRef = ref object
n: int
doAssert ObjRef(n:1) != ObjRef(n:1) # 参照が違うので一致しない
doAssert ObjRef(n:1)[] == ObjRef(n:1)[] # 値型なら一致する
unittest
モジュールも便利
setup
と teardown
ある
Goみたいにテーブルドリブンなテストが書けたらなお良いんだけど
とにかく楽にかける
変数宣言を楽にかける
普通ならこう書く
nimvar x = 1
var y = 1
var z = 1
ブロック表現で省略できる
nimvar
x = 1
y = 1
z = 1
const
a = 1
b = 1
c = 1
if else
や case of
が値を返す
三項演算子みたいにできる
nimvar a = 1
let x =
if a == 1: "ok"
else: "ng"
let y =
case x
of "ok": "OK"
of "ng": "NG"
else: "OTHER"
ブロックが値を返す
中間変数をブロックスコープに閉じ込められる
nimlet x = block:
var z = 1
z = 2
z = 3
z # これが戻り値になる
echo x
# echo z # ここでは変数zにはアクセスできない
同じ理屈で、 if else
のブロックでも同じことができる
for
の値の返し方を選べる
nimvar x = ["a", "b", "c"]
# これだと v には配列の値が入る
for v in x:
echo v
# これだと i にループカウンタ、 v に配列の値が入る
for i, v in x:
echo i, v
forループはこの in
の書き方しか無い
この書き方だけでいい
回数指定でループしたい時はレンジを使う
nim# 0, 1, 2, 3, 4, 5 の6回ループする
for i in 0..5:
echo i
# 上限値を含めたくない場合は ..< を使う
for i in 0..<5:
echo i
とにかくメソッドチェーンできる
自前のプロシージャを追加すると組み込み型だろうが型にメソッドが生える
これ超超超超超すき
こんな感じにシーケンスをチェーンしまくれる
nimimport strutils, sequtils, strformat
echo [1, 3, 5].mapIt(it * 2).filterIt(4 < it).mapIt(&"{it:>03}").join("\n")
マクロ便利すぎ
strformat
の &
で変数を文字列リテラル内に展開できる
json
の %*
でJsonNodeオブジェクトをいきなり宣言できる
to
でJsonNodeをObjectに変換できる
Jsonの扱いが楽すぎる
サードパーティのマクロも便利すぎ
シーケンス、テーブル便利すぎ
sequtils
と algorithm
と tables
に便利モジュールがいっぱいある
nim# 型推論で最初のリテラルだけ明確に型を書けば、あとの値は型を明確に書かなくても推論してくれる
# uint16型のシーケンス
var seqvar = @[255'u16, 1, 2]
import tables
var tbl = {"h": "hello", "w": "world"}.toTable
シーケンスのfilter, sort, mapが1行でかける喜び
Go使ってるとこの辺が辛い
ストリーム処理楽すぎ
バイナリファイルを操作するのに streams
モジュールが便利すぎる
js
バックエンドだと使えないけれど
書くのが楽しい
公式が便利な関数をひたすら用意してくれてるので実装が楽
自分で毎回似たような処理書かなくていい
やりたいことに集中できる
サードパーティのモジュールが不足しているけれど
「自分で作って共有するか」という気持ちになれる
今は不足してるだけで、Go並に充実したら皆幸せになれそう
結論
Nim楽しいよ