そろそろ新しい言語に触れないとなあということでこれまでちらっと見たことがあったプログラミング言語Nim
index - Nim Programming Language
を触ってみることに決定。(1)とついていますが、これで飽きてやめるかもしれませんが悪しからず。
とかがあるみたいです。自分にとってのHello, World!はパーザコンビネータを作成することだと以前書いたことでもあるし、さっさとパーザコンビネータを作ってみました。
つまづいたポイントをいくつか:
- GenericsはC++のtemplateの様に展開されてから型チェックが行われるので、定義したあとに呼び出して初めて型エラーがわかることが多い
- 謎のinternal errorがしばしば発生する
- 無名関数(Anonymous Proc)の型を表記する構文がしんどい:
proc(arg: type): type
のように書かなければならず、しかも、型であるにもかかわらず仮引数名はどうやら省略できないらしい。 - Anonymous Proc自体の構文もしんどい。無名関数の返り値だけでなく引数の型もすべて表記しなければいけないため、複雑な型を受け取る無名関数を書こうとするとかなり面倒くさい。
- インデントすべきところとしないで良いところの区別が不明瞭
- 一行に押しこもうとすると、複雑な行はインデントしてくださいという旨のコンパイルエラーが出る
- タプルがあるのは良い
- Genericsもおおむね素直に書ける
今のところの感想としては、内部DSLを書くのにはあまり向いていない言語だなあ…というところでしょうか。