Nim
Nimで動的ポリモーフィズムをしてみる
Pythonのような構文で記述でき、「効率的で表現豊かで優雅」なNimで動的ポリモーフィズムしてみた。
構文こそPythonライクではあるものの、class構文がなくデータと処理を別々に記述する言語なので、どちらかというとGoやRustというか、もっといえば「Pythonの皮をかぶったC」というイメージの言語だ。
他の言語へトランスパイルして、その後それぞれの言語のコンパイラでコンパイルしたり、インタプリタで実行したり、という使われ方をする。
Nimからネイティブコードにコンパイルする際は、Nimコンパイラが一度Cのコードを吐き出し、それをCコンパイラがネイティブコードにコンパイルするという流れになる。
クラスこそ無いが、GoやRustと違って構造体の継承ができるし、関数をmethodで定義することで動的ディスパッチが可能になり、関数のオーバーライドができる。
Nimはこの「継承」と「オーバーライド」の2つができるので、動的ポリモーフィズムが可能な言語だ。
ただし、Rustのimplのような「構造体と関数を紐づけるための専用構文」が無いので、関数のシグネチャを区別することで同名関数を定義し、第一引数にユーザー定義型を取ることで構造体と関数を紐づけていく。(つまり関数のオーバーロードを使ってデータと処理を紐づけていく)
さらにD言語のように関数の第一実引数を関数名の前に置くことでメソッドチェーンによる記述ができる。
アップキャストはC++やJavaと同様、明示しなくても暗黙的にやってくれる。
習得にはいろんな言語の基本的な知識が前提として必要そうに思えるので、入門用言語としてはハードルが高そうだが、不思議な面白さのある言語だ。
|