kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Nim勉強日誌(1) Hello, Parser Combinator!

そろそろ新しい言語に触れないとなあということでこれまでちらっと見たことがあったプログラミング言語Nim

index - Nim Programming Language

を触ってみることに決定。(1)とついていますが、これで飽きてやめるかもしれませんが悪しからず。

  • Python風味のインデント文法
  • マクロ
  • 演算子オーバーローディング
  • 実行速度を上げるためのいろいろな工夫

とかがあるみたいです。自分にとってのHello, World!はパーザコンビネータを作成することだと以前書いたことでもあるし、さっさとパーザコンビネータを作ってみました。

gist.github.com

つまづいたポイントをいくつか:

  • GenericsC++のtemplateの様に展開されてから型チェックが行われるので、定義したあとに呼び出して初めて型エラーがわかることが多い
  • 謎のinternal errorがしばしば発生する
  • 無名関数(Anonymous Proc)の型を表記する構文がしんどい: proc(arg: type): type のように書かなければならず、しかも、型であるにもかかわらず仮引数名はどうやら省略できないらしい。
  • Anonymous Proc自体の構文もしんどい。無名関数の返り値だけでなく引数の型もすべて表記しなければいけないため、複雑な型を受け取る無名関数を書こうとするとかなり面倒くさい。
  • インデントすべきところとしないで良いところの区別が不明瞭
    • 一行に押しこもうとすると、複雑な行はインデントしてくださいという旨のコンパイルエラーが出る
  • タプルがあるのは良い
  • Genericsもおおむね素直に書ける

今のところの感想としては、内部DSLを書くのにはあまり向いていない言語だなあ…というところでしょうか。