自作言語 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