The wait is over. Nim v1 is here. 👑https://t.co/fTmnaC0e1q pic.twitter.com/u6oIhF6QaH — Nim language (@nim_lang) September 23, 2019

Nim

今朝たまたまこんなツイートが流れてきて、聞いたことある言語だったので気になって触ってみた。 見たところ、静的型付けで文法も結構親しみやすい感じ。その上パフォーマンスが良いとか。ひょっとしてこれから来る言語なのでは。知らんけど。解説は先駆者の記事とか読んでください。最近の言語かと思ったら初登場が 2008 とからしくて意外と歴史を積み重ねてる。

お題を考える

やるからには何か意味のあるものを作らないとつまらないので、お題を考える。

せっかくだから何か役に立つものをとお題を考えたんだけど、ソース中の TODO 見つけてその関連 issue が閉じられてるか調べるやつでも作る？ — Yosuke Torii / ジンジャー (@jinjor) September 27, 2019

良さそうな題材が浮かんだのでこれで。

インストール

Mac なので brew install nim でサクッとインストール。パッケージマネージャの nimble も付いてくる。

ここで簡単な文法を学びつつ、コンパイルの方法 num c -r greetings.nim を覚えた。

Part I から Part III まであるので一通り目を通した。と言っても３つ目は主にマクロの話なので、１〜２を読んでおけば大体なんとかなる。とは言え想像よりもボリュームがあるので頑張りが必要。なんかもっとチャラい言語を想像してたんだけど、結構ガチ系っぽい。

言語仕様は結構センス良い感じだと思った。普段やってる TS とかと比べると若干コンパイル時の処理とかメモリの場所とかを気にするようになっているけど、普通のプログラムを書いている分には明示的なメモリ確保とかポインタ操作とかはしなくて良さそう。

早速プログラムを作り始める

チュートリアルは基礎文法中心でアプリの作り方という感じではなかったので、まず何から取り掛かればいいのか分からなかったのだが、まあ nimble init とかしたらプロジェクトの雛形が出来るんでしょと思ったらそうだった。ただプロジェクトの中にもう一個ディレクトリが出来るという謎の動きをしたので、一枚皮を剥がした。プロジェクトのタイプとしては、ライブラリとバイナリとハイブリッドの３つから選べるようだ。

nimble run で確認するサイクルを回そうと思ったけど、なんか上手く動かなかったので nimble build して出てきたものを実行した。

ひたすら API ドキュメントを読みながら進める

ここからはとにかく API ドキュメントとにらめっこしながら進めていくしかない。 JS とかと違って StackOverflow とかによくある書き方みたいな情報が全然ないし。だけど標準ライブラリはかなり充実していて、不親切ということはない。自力で進むコツを掴みさえばなんとかなる（はず）。

まず grep を実行するために child process の実行の仕方（osproc）と正規表現の使い方（re）を覚える。次に HTTP （httpclient）の使い方と JSON のパースの仕方（json）を覚える。アウトプットに色もつける（terminal）。最後に、引数もちゃんとパース（parseopt）して CLI として使えるようにする。色々と一通り触れる良いお題だったっぽい。

ちょっと詰まったのが HTTPS を実行しようとすると実行時に SSL support is not available. Cannot connect over SSL. [HttpRequestError] と怒られる。コンパイル時に -d:ssl を指定しないといけないらしい。 nim コマンドはそれでいいんだけど nimble 経由で渡すにはどうすればいいのよって探し回ったら、 nimble build にそのままフラグを渡せるよって閉じられた issue に書いてあった。

あとは stdout.write の後に flushFile し忘れると何も出ないとか、 seq に sort がないとか、seq から配列に変換する簡単な方法がないとか、正規表現バグってないかとか、細かいつまづきポイントはあったものの、全体としては「こんな感じかな、えい」ってやると大体動く。文法が直感的で良い。あ、でも全体的にかなり手続き的な書き方をするので、関数型フリークは満足しないかも。

完成・感想

というわけで完成しました。

TODO に紐づいた Issue が close されてたら警告してくれるツール。初の Nim 製です。 pic.twitter.com/Y6Lia9Zm5C — Yosuke Torii / ジンジャー (@jinjor) September 28, 2019

標準ライブラリが充実しているおかげでプロジェクトがかなりスッキリしてますね。 TypeScript だと tsc と argv と chalk と node-fetch を入れて tsconfig も書いて...となることを考えると、最初から揃ってるのはかなり嬉しい。あとはもう少し情報とコミュニティ規模が〜という感じはするけど、時間が解決してくれることを期待してます。

おしまい。