NimのTutorial Part1を終えて

とりあえずday1、Tutorial1を進めてみた上でのメモです。
英語はそんなに得意ではないので、@KTakahiro1729 さんの

Nim Tutorial Part Iを日本語訳してみた(前編)
Nim Tutorial Part Iを日本語訳してみた(後編)

に助けられました、ありがとうございます!

環境構築

macOS Sierra 10.12.6

$ brew install nim 
$ nim -v
$ Nim Compiler Version 0.17.2 (2017-09-08) [MacOSX: amd64]

で問題なく入りました。

基本的に記述が簡素

記述がいたるところで簡素です。
言語思想として全てはこれに尽きそうな雰囲気ですが、静的型付け言語として特徴的だと思います。

# 出力の例
echo "Hi, ", name, "!" 
echo "int value: ", $myint #intのキャスト

タイプしやすいし、簡素でいいです。
echoにはimport等も特別必要ないし、スクリプト言語のようにスッとかけます。

# 定義の例 
var 
  x, y: int
  # コメントも可能
  a, b, c: string

let
  x = 0     # x is of type int
  y = 0'i8  # y is of type int8
  z = 0'i64 # z is of type int64
  u = 0'u   # u is of type uint

const
  x = 1
  y = 2
  # コメントも可能で計算もできる
  z = y + 5

type
  MyEnum = enum
    a = 2, b = 4, c = 89

これまたJavaScriptのような、いやそれ以上な手軽さがあってとっつきやすいです。

# 変数オーバーロードの例

type MyPoint = object
  x: int
  y: int

# バッククォートでオーバーロード!!
proc `+`(left: MyPoint, right: MyPoint): MyPoint = 
  MyPoint(x: left.x + right.x, y: left.y + right.y)

var p1 = MyPoint(x: 10, y: 40)
var p2 = MyPoint(x: 20, y: 10)
var p3 = MyPoint(x: 30, y: 80)

var p4 = p1 + p2 + p3
echo "x: ", p4.x, "y: ", p4.y

いままで混乱を避けるためにあまり利用していませんでしたが、これは麻薬的な効果がありますね。。
ここまで簡素だとやはり使ってみたくなってしまいます。

関数定義が柔軟

NimではProceduresと称されています。
もちろん記述は簡素なのですが、細かいところで気が利いてるなぁと思いました。

# 返り値の省略
proc sumTillNegative(x: varargs[int]): int =
  for i in x:
    if i < 0:
      return # 暗黙のresult返却
    result = result + i # 暗黙のresultの打ち消し

echo sumTillNegative() # echos 0
echo sumTillNegative(3, 4, 5) # echos 12
echo sumTillNegative(3, 4 , -1 , 6) # echos 7

これまたJavaScriptみたいに扱えて感触良いです。

# 可変引数
proc myWriteln(f: File, a: varargs[string, `$`]) =
  for s in items(a):
    write(f, s)
  write(f, "\n")

myWriteln(stdout, 123, "abc", 4.0)
# 定義だけで勝手にキャストしてくれる
myWriteln(stdout, [$123, $"abc", $4.0])

これも地味にすごいと思いました。

文字列の最終位置参照がエラーにならない

いいのか悪いのかちょっとよくわからないのですが、NimでのStringは最終位置が0となるようで、そこへのアクセスを行ってもエラーにならないようです。

var str: string = "abc"
for i in 0..len(str):
  echo $str[i] # str[3]でエラー吐かない

地味にコード量減って意外と活用する箇所がありそうな雰囲気です。

実際に触ってみてと次にやること

チュートリアルをやっていて思ったのは、言語を書くというプリミティブな行動は、創造性があり楽しいものであるべきだということでした。
月並みですが、初めてプログラミングを始めた頃のような気持ちを取り戻せていいですね。
これはきっとRustでもPythonでもGoでも同様のことを思ったと思いますが、Nimの場合圧倒的に無駄な記述を無くすことにひとつのアイデンティティを感じます。
シンプルな記述はコードを書いていても気持ちいいので、もう少しNimに付き合ってみたいなという感想です。
あと、想像していたよりはドキュメントも揃っているイメージです。
1,2年前くらいとは少し状況は変わっているのではないでしょうか。

次はTutorial2と思ったのですが、冒頭で

Note that this document is somewhat obsolete as the manual contains many more examples of the advanced language features.

とあるのでマニュアルの方を参考にしつつ、実際に簡単なWebアプリを作ってみたいと思います。

全く関係ないですが、はてなブログシンタックスハイライト対応言語にNimがあったのが地味にびっくりでした。