Scalaで俺言語作る。
クロージャになってて、マクロも使えるかんじになってます。
配列やら、ループやら、なんやら足らないものも多いですけど、ほとんど、
多値とパターンマッチだけで、いろいろ出来て楽しいです。
http://gist.github.com/46417
クロージャ
c=(fun(){c=1;fun(){c=c*10}})();c()+c()+c()
で、1110が返る
ブロックを受け取る関数
関数fが引数をn個受けとるときに、関数呼び出しの後ろに{}があると、
そこのブロックが最後の引数として渡される。
例)
f=fun(a,block){if(a)block() else -1} f(1){print('ok)} a(0){print('ng)}
で
'ok
- 1
となる
マクロ mac(パターン)展開式
マクロは実行前にパターン内でプログラム内をマッチングし、パターンにマッチしたら
展開式部分を実行して結果をプログラムに埋め込む
mac(hoge)3 hoge -> 3
シンボル 'a と 'b にマッチして、a-bを読み込み時に計算して5を返している
また、シンボルを使うことで、引数を使うことが出来る。
例)
mac(sub('a,'b))a-b sub(10,5) -> 5
自作のif文を作るときは以下のようにするとうまくいかない
mac(myif('a){'b})if(a)b myif(3){5} -> 5
これだとよさそうだけど、
mac(myif('a){'b})if(a)b f=fun(c){myif(c){5}} a(0) ->5
になる、なぜかというと、マクロは展開時に実行されるため
f=fun(c){5} a(0)と展開されているためです。
そこで、クアシクォートとアンクオートを使って以下のように書くとうまくいきます。
mac(myif('a){'b})qq{if(uq{a})uq{b}} f=fun(c){myif(c){5}} a(0) ->5
といったかんじのことができるようになりました。
Scalaでゲーム。
といっても、ゲーム性がまだいまいちなのだけど、、、。
いちお、弾幕よけるゲームになってて、敵キャラはねこび〜ん@金子うんたらコモンなんたらです。
Scalaでちゃんと、アプレット作って音も鳴るぜ、ベクターデータだぜと。
http://freecluster.net/scala/game.html