Rustばかり使っている今日この頃
最近Rustの理解が、少しずつではありますが、進んできて、面白くなってきたので、よく使っています。しかし、せっかく勉強したことを忘れてしまうのはもったいないので、他の言語も時々は触るようにしています。さて皆様、Nimは使ってらっしゃいますか?どのような印象をお持ちでしょうか?
私はまだまだ使いこなせているというようなレベルではありませんが、勉強を始めた当初からずっと、何とも謎めいた言語だな、という印象を持っています。
Nimは静的型付けで、ガベージコレクタを搭載しており、C・C++・JSにコンパイル可能な言語です。それはともかくとして、謎めいたところがいくつか存在します。例えば、以下のようなint型のシーケンスがあるとします。
var s: seq[int]
s = @[1, 2, 3, 4, 5]
このシーケンスの各要素を2倍にしたものを得たい場合、sequtilsモジュールのmap関数を用いますが、
import sequtils
var s: seq[int]
s = @[1, 2, 3, 4, 5]
echo s.map(proc (n: int): int = n*2)
----
結果
----
@[2, 4, 6, 8, 10]
このような感じになります。つまり通常関数定義に用いるprocをクロージャのように使うことができます。しかし謎めいたところはここからさらに奥にあります。
import sequtils
var s: seq[int]
s = @[1, 2, 3, 4, 5]
echo s.mapIt(it*2)
結果は同じになります。つまり、前者のコードの短縮形となります。xxxItという形のメソッドは他にも存在します。果たしてどちらが可読性が高いのか?ぱっと見では後者のほうが、何となくスッキリしておりますが、内部処理がはっきりわかるのは前者のほうです。例のようなmapItは、どのようなものか知っていれば使えますが、こういう関数だと思って使うとエラーになります。なぜなら引数であるitという名前はit以外は使えないからです。謎だ。
また、以下のような書き方もできます。
echo map(s, proc (n: int): int = n*2)
または
echo mapIt(s, it*2)
Nimでは[第一引数]ドット[関数]も[関数](第一引数)も同じ意味になります。自由度が高い時もあれば、ピンポイントで不自由なところもある、なんとも謎めいた言語です。したがって、自身である程度一貫したルールを決めて書かないと、可読性が悪いものになるかもしれません。現在のバージョンは0.19です。1.0バージョンが登場する頃には、統一感のある言語になっているかもしれません。はたまた限りなく自由な言語になっていくかもしれません。もともとNimはマクロや同図像性を備えた言語(Lispの影響を受けているらしい)であるため、多くの方言ができるかもしれません。