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