自作言語 oak その1
自作言語作るぞ作るぞ詐欺を始めてはや数年、やっとこさ自作言語に取り掛かり始めた。今はパーサーを手書きしている。
最初は yacc だの bison だのといったLALRパーサ生成器でやろうかと思ったけど、最近の言語はLL文法が流行っているらしく、再帰下降パーサーを手書きすることにした。構文は関数型言語っぽくしたいと思っている。だが、言語仕様も関数型言語のようにするかは決まっていない。
構文の雰囲気はこんな感じ:
let x:int = 100, y:string = "a string"; //x = 200 : error var a = 20; // same as 'let a: var int = 20;' a = 30 // ok func:int factorial n:int (n>=0) = n * factorial (n-1) when n > 0 else 1; func:[b] map f:a->b xs:[a] = (map f (xs!!(0, $-1))) ~ [f (xs!!($-1))] when xs.length > 0 else []; proc show_factorial n:int { n |> factorial |> writeln; // pipe-line operator // same as: //writeln@factorial n; // @ : function composition }
今一番悩んでいるのは型システムで、特に関数の純粋さについて。func は純粋な関数、proc は非純粋な関数ということにしたいのだが、たとえば型 a -> b にどうやってその情報を付与するかを考えている。pure a -> b とするのもちょっとなあ・・・というか。
当然実装はD言語でだよな。 https://github.com/marx-saul/oak