Nimの関数について
Nimでは関数のオーバーロードができます。Nimでは独自の演算子が定義でき、オーバーロードができるので、演算子を活用したライブラリなども作れます。(例:パーサコンビネータなど)
それだけでなく、method call syntaxもあることによって、独自のライブラリでもNimらしい見た目で使うことができるので、とても読みやすいソースコードになります。(Nimは速度、生産性だけでなく読みやすさも重視しています)
以下はmethod call syntaxの例です。
# 両方共同じ意味 writeLine(stdout, "Hello!!") stdout.writeLine("Hello!!")
演算子
Nimで演算子は普通の関数定義で演算子をバッククォートで囲むことによって定義できます。
type MyInt = object value: int proc newMyInt(value: int): MyInt = return MyInt(value: value) proc `+`(left, right: MyInt): MyInt = return newMyInt(left.value + right.value) proc `$`(myint: MyInt): string = return $myint.value echo newMyInt(100) + newMyInt(50)
上記のコードは自作の型であるMyIntに新しい演算を定義しているコードです。
例
method call syntax、演算子オーバーロード、そして前回のdistinctを使うと新しい単位を定義するようなこともできます。
type Ether = distinct int proc `+`(left, right: Ether): Ether {.borrow.} # borrowは元の関数を借りてくる付加情報(プラグマ) proc `$`(ether: Ether): string {.borrow.} echo 50.Ether + 600.Ether
上記は新しい単位エーテルを定義している様子です。(ゲームとかに使うと面白そうですね)
まとめ
以上がNimの関数についてです。Nimの関数はDSL的に使うこともでき、とても読みやすいと思います。
DSLについてはNimの重要な機能であるtemplateやmacroと組み合わせて真価を発揮するものなので、それについてもいずれ記事を書きたいと思います。