アップデート
私は、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のブログをご覧ください。