[前][次][番号順一覧][スレッド一覧][生データ]

langsmith:218

From: MAEDA Atusi <maeda-langsmith atusi.org>
Date: 16 Apr 2005 17:43:39 +0900
Subject: [langsmith:218] Re: C#の匿名メソッド..なぜ、ローカル変数を共有するのか?

まず、理念としてなぜ変数の束縛を共有するか、というと以前の三段論法の例
に戻りますが、

MAEDA Atusi <maeda-langsmith atusi.org> writes:

>   {  int x = 0;
>      x++;       // (A1)
>      {
>         x++;    // (A2)
>      }
>      {
>         x++;    // (A3)
>      }
>      Console.WriteLine("{0}", x);
>   }

上で、xはすべて同一の変数を意味しているのに、

> {
>   D d1, d2, d3;
>   {  int x = 0;
> 
>      x++;       // (C1)
>      d1 = delegate {
>         x++;    // (C2)
>      };
>      d2 = delegate {
>         x++;    // (C3)
>      };
>      d3 = delegate {
>        Console.WriteLine("{0}", x);
>      };
>   }
>   d1();
>   d2();
>   d3();
> }

こちらではそうじゃなくて「コピーして共有しない」とすると不自然で分かり
にくい、と思います。

もっといえば、(C#にはないけど)xがグローバル変数だと仮定すると、xはどこ
から見ても同一の変数を共有しますよね。グローバル変数も単に「いちばん外
側にあるローカル変数」と考えれば、他のローカル変数と扱いが変わるのはお
かしいですよね。

"machida,tatsuhiko" <t.machida.unicom jcom.home.ne.jp> writes:

> >  count_up, count_down, count_show = counter()
> >  count_show.call()    #=> 0
> >  count_up.call()
> >  count_show.call()    #=> 1
> >  count_down.call()
> >  count_show.call()    #=> 0
> 
>  となっていましたが、自分が疑問なのはこの機能の部分だったんです。
> 
>  C#で考えると、匿名メソッドの乱用に思えます。
>  関数言語は詳しくないのですが、オブジェクト指向言語なら、
>  オブジェクトかインタフェースで実現したほうが自然ですよね。

オブジェクトも、関数クロージャも、どちらも「データ(変数の集合)とコード
を1つにまとめたもの」と言う意味で似ています。両方もつ言語(C#やRuby)も
ありますし、どちらかで済ませる言語(JavaやScheme)もあります。

上のカウンタの例とか、先の例のComparatorとかは、Javaだと、そもそも
delegateも「外側の変数を閉じ込める機能」もありませんから、オブジェクト
として作るでしょう。C#でも、delegateを使わずに、オブジェクトだけ使うな
らば、ローカル変数を閉じ込める機能は(共有だろうとコピーだろうと)別にい
らないでしょう。

副作用のある関数型言語(SchemeやML)だと、(最近ではオブジェクトを使うこ
ともできますが、関数型の機能だけ使うと)オブジェクトは全く出てこなくて、
関数に閉じ込められたローカル変数だけですべて行なうでしょう。

C#が両方入れたのは、いかにもC#らしいと思います。なんとなく。

私なりの勝手なまとめ:
・関数型言語: 変数と言えばスコープの決まったローカル変数だけ。インスタ
  ンス変数っぽく、状態をずっと保持する変数が欲しければ、ローカル変数を
  関数の中に閉じ込める。
・Java: 名前をつけなくても起動できる、「関数」にあたるfirst-classのデー
  タは元々ない。だから「その時点でアクセスできる外側のローカル変数を関
  数に閉じ込める」という機能もない。
  プログラムのコードといえば、オブジェクトのメソッドだけ。メソッド名を
  指定しないとデータ中のコードを呼び出すことはできない。動的に関数を作
  る(高階関数)みたいなことがやりたければ、オブジェクトを作る。動的に決
  まる値はインスタンス変数に保持する。
・C#: メソッドも名前のない関数データ(delegate)もある。インスタンス
  変数を使っても良いし、関数に閉じ込めた変数を使っても良い。APIや、プ
  ログラマが設計したインターフェースに応じて、どちらでも使える。

				前田敦司

--
ML: langsmith quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

       197 2005-04-15 09:56 [t.machida.unicom jco] C#の匿名メソッド..なぜ、ローカル変数を共有するのか? 
       198 2005-04-15 11:15 ┣[shiro lava.net      ]                                       
       201 2005-04-15 12:02 ┃┣[t.machida.unicom jco]                                     
       202 2005-04-15 12:16 ┃┗[maeda-langsmith atus]                                     
       199 2005-04-15 11:32 ┗[maeda-langsmith atus]                                       
       200 2005-04-15 11:50  ┣[maeda-langsmith atus]                                     
       203 2005-04-15 12:27  ┗[t.machida.unicom jco]                                     
       204 2005-04-15 12:52   ┣[matz ruby-lang.org  ]                                   
       209 2005-04-16 14:26   ┗[maeda-langsmith atus]                                   
       210 2005-04-16 15:41    ┗[t.machida.unicom jco]                                 
       211 2005-04-16 15:47     ┣[t.machida.unicom jco]                               
       212 2005-04-16 16:13     ┗[matz ruby-lang.org  ]                               
       213 2005-04-16 16:31      ┣[maeda-langsmith atus]                             
       215 2005-04-16 16:54      ┃┗[matz ruby-lang.org  ]                           
       214 2005-04-16 16:35      ┗[t.machida.unicom jco]                             
       216 2005-04-16 16:59       ┣[matz ruby-lang.org  ]                           
       217 2005-04-16 17:34       ┃┗[t.machida.unicom jco]                         
       219 2005-04-16 18:20       ┃ ┣[kmori lsi-j.co.jp   ]                       
       220 2005-04-16 19:32       ┃ ┗[shiro lava.net      ]                       
       221 2005-04-17 00:16       ┃  ┣[matz ruby-lang.org  ]                     
       222 2005-04-17 14:46       ┃  ┗[hyuki hyuki.com     ]                     
       223 2005-04-18 00:30       ┃   ┗[matz ruby-lang.org  ]                   
->     218 2005-04-16 17:43       ┗[maeda-langsmith atus]