2018/10/01

Nim 0.19 リリース!

アップデート

私は、Linuxを使用しており、インストール時にchoosenimを使っているので、以下のコマンドでアップデートできました。

$ choosenim update stable
ちょっと時間がかかるのが気になりますが、無事にアップデートできました。

新しい機能 "func"

Nim 0.18では、副作用のあるプロシージャに{.noSideEffect.}プラグマをつけると、コンパイル時にエラーになり、副作用をコンパイル時に発見できていました。例えば以下のようなプロシージャでは

proc hello(name: string) {.noSideEffect.} =
  echo "Hello, " & name

副作用があるため、コンパイル時にエラーになります。副作用を知ったうえでのコードであるならば、{.noSideEffect.}プラグマを使用しなければコンパイルは通ります。しかしながら、コードが多くなるにつれ、だんだん不便を感じることも出てくると思います。
今回導入されたfuncは、この不便さをかなり解消してくれるのではないでしょうか?funcは、上記のコードのエイリアスであり、以下のように書き換えることができます。

func hello(name: string) =
  echo "Hello, " & name

つまり、procで書いていたプロシージャをfuncで書くことによって、どこに副作用があるかが明確になります。例えば以下のような副作用のないプロシージャに用いてもなんら問題はありません。

func hello(name: string): string =
  "Hello, " & name

echo hello("Tom")
もし必要な副作用である場合は、そのプロシージャのみprocに書き直せばいいわけです。
簡単なTodoを表示するプログラムを作成してみました。コードは以下のようになります。

import times, strformat

type
  Status {.pure.}= enum
    Complete
    Incomplete

type
  Todo = ref object of RootObj
    scheduled: DateTime
    deadline: Datetime
    status: Status
    body: string

func output_todo(td: Todo): string =
  fmt"""
    scheduled: {td.scheduled}
    deadline: {td.deadline}
    status: {td.status}
    body {td.body}
  """
  
var myTodo: Todo

# create new todo.
myTodo = Todo(
  scheduled: initDateTime(2, mSep, 2018, 10, 0, 0, utc()),
  deadline: initDateTime(3, mSep, 2018, 0, 0, 0, utc()),
  status: Status.Incomplete,
  body: "create todo")

echo output_todo(myTodo)

# status change.
myTodo.status = Status.Complete

echo output_todo(myTodo)
単にスケジュールを出力するだけですが、funcを使って書いてみました。副作用がないので、コンパイルは通ります。私のリポジトリに置いてますので、良かったらお試しください。
その他、結構な量の修正や追加があったようです。まだ全部見れてはいませんが、今後じっくり見ていきたいと思います。詳しくはnimのブログをご覧ください。