...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

Full Closure (2)

http://d.hatena.ne.jp/nazodane/20071103/1194086171
これならOKですね.

import std.stdio;

int delegate()[string] createCounter(){
  int cur = 0;
  int delegate()[string] aa;
  aa["next"] = {return cur++;};
  aa["prev"] = {return cur--;};
  return aa;
}

void main(){
  auto count = createCounter();
  writefln(count["next"]());//0
  writefln(count["next"]());//1
  writefln(count["prev"]());//2
  writefln(count["prev"]());//1
  writefln(count["prev"]());//0
  writefln(count["prev"]());//-1
}

count()が返す値がインクリメント/デクリメントする前の値ってのがなんか違和感あるけどこういうもんなのかな.
インクリメント/デクリメントした後の値をもらえるようにするにはどうしたらいいんでしょうか.


で,まだこの形の初期化はまだうまくいかないみたい.

int delegate()[string] aa = ["foo":{return 0;}, "bar":{return 1;}];

一個ずつ連想配列に代入すればおk.
前にもあったバグがまだ残っているのだろうか.
それと,型推論も不完全みたい.
これがコンパイルエラーになる.

auto aa = ["foo":{return 0;}, "bar":{return 1;}];