« 2007年10月 | トップページ | 2008年5月 »

2008年4月27日 (日)

C#のyieldを甘く見てました

VBばかり見ていたせいでC#のyieldのすごさを見逃していました。

C# 2.0でyieldが登場した時は、「簡単に列挙できて便利だなぁ、VBにもあればいいなぁ、でもなくてもなんとかなるからしばらくは我慢するかぁ」くらいに思っていたのですが、最近知りました。

yeild returnで返すメソッドは遅延評価されるって皆さんご存知でしたか?(このようなメソッドをサブルーチンではなく『コルーチン』と呼ぶらしいです。)

たとえば、このC#のコードを眺めます。

        private void button1_Click(object sender, EventArgs e)
        {

            var ar = GetEnum();

            listBox1.Items.AddRange(ar.ToArray());
          
        }

        private IEnumerable<string> GetEnum()
        {
            yield return "Apple";
            yield return "Banana";
            yield return "Cat";
            yield return "Dog";
        }

GetEnumメソッドが実行されるのは、どのタイミングかというとlistBox1.Items.AddRangeの行なんですね。てっきりvar ar = GetEnum()の行かと思ってしまいますよね。ちょっとステップ実行してみてください。

まぁ遅延実行も別になくてもいいんですけど、LINQの演算子の標準実装がこれなんでちょっと気になりました。

クエリ式では定義済みの演算子を使用するだけなので別にVBでLINQの機能が制限されるとかそういうことではないです。ただ、メソッドベースのLINQを使うときに自作の拡張メソッドを作る場合にC#ならばyield returnを使用することで標準のLINQと同じような遅延評価ができるのに、VBだと自作の演算子だけ即時評価にならざるを得ないかなと思っただけです。

はい。別に自作演算子で即時評価が行われてもいまのところ特に困る気はしません。

| | コメント (3) | トラックバック (3)

2008年4月22日 (火)

「考える」の語源

岩波文庫の「日本書紀」は解説(注・補注)が非常に非常に面白いです。日本書紀の内容より補注が面白いです。補注が本文と同じくらいボリュームがあります。

それで今日知ったのですが「考える」という言葉は上古は「カムカヘル」でこれは「カ」を向かい合わせにして比べて合うか合わないか見比べてみるという意味なのだそうです。

そして、「カ」とは点・場所という意味で、いまでも「スミカ」とか「アリカ」とか一部の単語に残っているあの「カ」だというのです。まめ知識といってしまえばそれまでですがなんだか言葉が楽しくなってきますね。

久々の書き込みがVBネタじゃなくてすいません。

| | コメント (0) | トラックバック (0)

« 2007年10月 | トップページ | 2008年5月 »