The wait is over. Nim v1 is here. 👑https://t.co/fTmnaC0e1q pic.twitter.com/u6oIhF6QaH
— Nim language (@nim_lang) September 23, 2019
今朝たまたまこんなツイートが流れてきて、聞いたことある言語だったので気になって触ってみた。 見たところ、静的型付けで文法も結構親しみやすい感じ。その上パフォーマンスが良いとか。ひょっとしてこれから来る言語なのでは。知らんけど。解説は先駆者の記事とか読んでください。最近の言語かと思ったら初登場が 2008 とからしくて意外と歴史を積み重ねてる。
お題を考える
やるからには何か意味のあるものを作らないとつまらないので、お題を考える。
せっかくだから何か役に立つものをとお題を考えたんだけど、ソース中の TODO 見つけてその関連 issue が閉じられてるか調べるやつでも作る?
— Yosuke Torii / ジンジャー (@jinjor) September 27, 2019
良さそうな題材が浮かんだのでこれで。
インストール
Mac なので brew install nim
でサクッとインストール。パッケージマネージャの nimble も付いてくる。
チュートリアル
ここで簡単な文法を学びつつ、コンパイルの方法 num c -r greetings.nim
を覚えた。
Part I から Part III まであるので一通り目を通した。と言っても3つ目は主にマクロの話なので、1〜2を読んでおけば大体なんとかなる。とは言え想像よりもボリュームがあるので頑張りが必要。なんかもっとチャラい言語を想像してたんだけど、結構ガチ系っぽい。
言語仕様は結構センス良い感じだと思った。普段やってる TS とかと比べると若干コンパイル時の処理とかメモリの場所とかを気にするようになっているけど、普通のプログラムを書いている分には明示的なメモリ確保とかポインタ操作とかはしなくて良さそう。
早速プログラムを作り始める
チュートリアルは基礎文法中心でアプリの作り方という感じではなかったので、まず何から取り掛かればいいのか分からなかったのだが、まあ nimble init
とかしたらプロジェクトの雛形が出来るんでしょと思ったらそうだった。ただプロジェクトの中にもう一個ディレクトリが出来るという謎の動きをしたので、一枚皮を剥がした。プロジェクトのタイプとしては、ライブラリとバイナリとハイブリッドの3つから選べるようだ。
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
も書いて...となることを考えると、最初から揃ってるのはかなり嬉しい。あとはもう少し情報とコミュニティ規模が〜という感じはするけど、時間が解決してくれることを期待してます。
おしまい。