octahedron

LemとSKKとCommon Lispでたたかうプログラマのブログ

Nimに入門して簡単なアプリケーションを書くまで

TL; DR

 Nimに入門してアプリケーションをつくるまでの道筋を書きました。

Nimってどんな言語?

 NimはPythonっぽい見た目をもつ、コンパイラ言語です。静的型付きで、ネイティブコードを吐き、あといちおうメタプログラミングもできるという言語です。
 このslashdot.jp (現スラド)の記事「注目を集め始めるプログラミング言語「Nim」」を当時見て興味を持ちました。

 書いてみた感想としては、なかなか書きやすくていい言語です。Pythonだと思って書くには、だいぶC言語の香りが強い感じがしますので、注意。あと、辞書(連想配列)はありませんので、注意(正確には、tablesモジュールにありますが、Pythonの辞書ほど手軽には使えません)。NimのコンパイラC言語を経由してネイティブコードを吐きますが、実行可能バイナリのサイズがけっこう小さくて、速い。こっそりとJavaScriptなんかにもトランスパイルできたりします。
 あと、メタプログラミングできるのですが、マクロはあまり書きやすくないなあという印象です(S式ではないため)。

導入のしかた

 導入するにはaptで入れるか(きっとhomebrewにもあるのでしょう)、ソースからビルドするかの二通りがあります。ここでは、バージョンも選びほうだいな上、コンパイラ自体のソースコードデバッグ文を仕込めたりして楽しいため、ソースからビルドしましょう。

1.ソースコードを取得する

 ソースコードgithubから取得します。バージョンでタグを切ってあるので、現時点での最新安定版をチェックアウトします。

$ git clone https://github.com/nim-lang/nim.git
$ cd nim
$ git checkout v0.17.2

2. ビルドする

 ビルドはわりとすぐに終わります。Nimのコンパイラをビルドしたら、Nimの管理ツールのkochをNimコンパイラでビルドして、その後Nimのパッケージマネージャなんかをkochでビルドします。

$ sh ./ci/build.sh
...
$ ./bin/nim c koch
...
$ ./koch tools
...
$ ls ./bin
nim nimble nimsuggest

3. PATHを通す

 ビルドが終わったら、/path/to/nim/binにパスを通しましょう。ぼくはよく~/optにNimのリポジトリをクローンして、~/opt/nim/binにパスを通してます。

$ echo 'export PATH=$PATH:/home/user/opt/nim/bin' >> .profile

以上で導入完了です。

Nimの基本を覚えるために

 Nimの文法や言語の要素を覚えるために、ぼくが読んだのは以下のドキュメントです。

チュートリアル

 ぼくは、公式チュートリアルは3回くらい通して読みました。分量がけっこうありますが、Nimの全ての要素が詰まっているので、何回でも読みましょう(ぼくは今でもお世話になってます)。

マニュアル系

 パッケージの定義方法や構成については、NimbleのREADMEが参考になります。

Hello, World!

 NimのHello Worldはこんな感じです。

when isMainModule:
  echo "Hello, World!"

 一引数のときに括弧を省略できるので、こんなふうになってます。一引数の関数呼び出しが入れ子になっているときは、左結合的に解釈してくれるのかは謎です。

アプリケーションを作る

 で、入門してチュートリアルを4回くらい読んだはいいけど、何をつくってNimを経験したものでしょうか。新たな言語を試すとき、とりあえず一通りの機能を使いそうなアプリケーション、それはLisp処理系ですね。なのでそれを実装しました。

パッケージをつくる

 ライブラリパッケージを作成するにはnimbleコマンドを利用します。こんなふうにして、パッケージを作りましょう。

$ mkdir nimlisp
$ cd nimlisp
$ nimble init
...質問に答える
$ ls
nimlisp.nimble
$ touch nimlisp.nim  # このファイルにコードを書く

Lisp処理系を実装する

 Lisp処理系を実装するチュートリアルは、本当にたくさんあります。なので、ここではその実装方法を書くようなことはしません。驚くべき処理系を実装したがそれを書くには余白が狭すぎる

 お気に召さなければシェルでも実装してみましょう。

ビルドする

 書いたNimbleパッケージは、nimbleコマンドを使ってビルドすることができます。

$ nimble build
...
$ ls
nimlisp nimlisp.nim nimlisp.nimble

実行するときは、単純に、こうです。

$ ./nimlisp
welcome to nimlisp.
> 

おわりに

 ちなみに、こうやって書いたぼくのLisp処理系はこれです。地味にブラウザでも実行できます。

github.com

 まさかLisp以外の記事を書くことがあるとは…。