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]