generated at
Nimの個人的に好きなところ
Nim好き
何が好きかをせっかくなので言語化する

自分について
開発経験
仕事ではGo使ってる
詳細はjiro4989に書いてる
どれくらいNim触ってるか
2018年2月にはすでに触り始めていたっぽい
初めて自作のパッケージをパッケージディレクトリに追加したのが2019/5くらい
2020/2/9時点で15個自作のパッケージを追加した
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

好きなところ
Nimの特徴に書かれてることがだいたい好き
高速
ネイティブコンパイル
読みやすい
書きやすい
オフサイドルール
pythonと同じでインデントでブロックを表現する
C言語式の波括弧でブロックを表現するのだと、ブロックの終了で1行使ってしまう
ディスプレイに表示できる情報量には限りがある
ブロックの終了だけで1行使われるともったいない
タブ文字をインデントに許可しない
インデントに使えるのは半角スペースのみ
割り切っていて良い
タブ文字は嫌い
半角スペース2つが公式に勧められている
好き
テストコード書きやすい
スライスやオブジェクトの比較が == でできる
参照型のオブジェクト比較はそのままだと参照の比較になるが、 [] で値型に変換すると値比較できる
すげーーーーー楽
nim
type ObjRef = ref object n: int doAssert ObjRef(n:1) != ObjRef(n:1) # 参照が違うので一致しない doAssert ObjRef(n:1)[] == ObjRef(n:1)[] # 値型なら一致する
unittest モジュールも便利
setup teardown ある
Goみたいにテーブルドリブンなテストが書けたらなお良いんだけど
とにかく楽にかける
変数宣言を楽にかける
普通ならこう書く
nim
var x = 1 var y = 1 var z = 1
ブロック表現で省略できる
nim
var x = 1 y = 1 z = 1 const a = 1 b = 1 c = 1
if else case of が値を返す
三項演算子みたいにできる
nim
var a = 1 let x = if a == 1: "ok" else: "ng" let y = case x of "ok": "OK" of "ng": "NG" else: "OTHER"
ブロックが値を返す
中間変数をブロックスコープに閉じ込められる
nim
let x = block: var z = 1 z = 2 z = 3 z # これが戻り値になる echo x # echo z # ここでは変数zにはアクセスできない
同じ理屈で、 if else のブロックでも同じことができる
for の値の返し方を選べる
nim
var 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
とにかくメソッドチェーンできる
自前のプロシージャを追加すると組み込み型だろうが型にメソッドが生える
これ超超超超超すき
こんな感じにシーケンスをチェーンしまくれる
nim
import 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の扱いが楽すぎる
サードパーティのマクロも便利すぎ
jestercligenkaraxとかヤバさの極み
シーケンス、テーブル便利すぎ
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楽しいよ