Scalaの勉強をはじめたので、とりあえず簡単なパーサーを作ってみてます。
http://d.hatena.ne.jp/nowokay/20111109#1320815540
前回で関数リテラルまでできました。
http://d.hatena.ne.jp/nowokay/20111116#1321432559
ただ、
def high(x) ={y => x * y};
を呼び出すときに
high(3)(4)
などとするとエラーになっていたので、関数呼び出しのチェーンができるように構文を変えます。
funcCallのところをこう変えます。
def funcCall: Parser[AST] = factor~rep("("~>repsep(expr, ",")<~")")^^{ case fac~Nil => fac case fac~params =>{ //関数 var ret = fac for(param <- params){ ret = FuncCall(ret, param) } ret } }
この部分「(fac::params).reduceLeft(FuncCall(_,_))」のように書けるかと思ったけど、簡単には通らなかったのであとまわし(^^
処理とかは変わらず。
そうすると
println(high(3)(4))
が実行できるようになります。
そしたら、前回のforを
def forr(start, end)={proc => def impl(i)={ if(i < end + 1){ proc(i); impl(i + 1) }else{ 0 } }; impl(start) };
のように書けて
forr(2, 5)({ i=> println("forr:" + i); });
と使えるようになるので、ちょっと構文っぽく書ける。
いい感じ。
ソースはこれ
https://gist.github.com/1345875/06d5586f21cad4c22c9ea9a2e34f91cf5f4996fd