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