読者です 読者をやめる 読者になる 読者になる

Nim帳

プログラミング言語Nimについて書いていきます。

20160921155215

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と組み合わせて真価を発揮するものなので、それについてもいずれ記事を書きたいと思います。