langsmith:81
From: Shugo Maeda <shugo ruby-lang.org>
Date: Wed, 14 Jul 2004 01:52:07 +0900
Subject: [langsmith:81] 強い型の言語とクロージャ
前田です。 MAEDA Atusi wrote: > ところで、Javaには一見closureにとても良く似た記法があります。 > 無名クラスを使って、 > class MyClass { > void method1(final int x) { > ActionListener a = new ActionListener() { > public void actionPerformed(ActionEvent e) { > ... xへの参照 ... > }; > ... > } > } > みたいに書けたりしますが、ここでactionPerformedの中でxを変更することは > 出来ません。(actionPerformedの中で参照するmethod1の変数は、finalでない > とコンパイル時にエラーになってしまいます。) あまり関係ないのですが、強い型の言語にクロージャを導入した場合、型の扱い はどうするのが望ましいでしょう。 たとえば、C#に将来追加されるクロージャ(匿名メソッド)の場合、あらかじめ、 public delegate bool Foo(int i, string s); のようにクロージャの型(delegate)を定義しておいて、 public void Bar(Foo foo) { ... } public void Baz() { Bar(new Foo(i, s) { ... }); } のように使うようです。 (http://www.microsoft.com/japan/msdn/vs/vcsharp/vbconCProgrammingLanguageFutureFeatures.asp#vbconcprogramminglanguagefuturefeaturesanchor4) あらかじめ型を定義させる代りに、 // C#風の上手い文法が思いつきませんでしたが、boolが戻り値の型です public void Bar(Closure<bool, int, string> foo) { ... } public void Baz() { Bar(new Closure<bool, int, string>(i, s) { ... }); } のように、シグニチャが一致したら型適合する、というような行き方もあるのか なと思ったのですが、C#のような名前による型適合の言語だと、前者の方が自然 でしょうか。 ちなみにSatherのクロージャは匿名にはできない(RubyのObject#methodみたいな ものです)のですが、型適合に関しては後者のスタイルですね。 -- 前田 修吾 -- ML: langsmith quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
76 2004-07-13 12:42 [mogami brain.riken.g] 変更可能なclosure変数、対、static変数 77 2004-07-13 13:42 ┣[nobsun sampou.org ] 78 2004-07-13 15:07 ┣[maeda-langsmith atus] 80 2004-07-13 19:58 ┃┣[mogami brain.riken.g] Re: 変更可能なclosure変数、対、sta -> 81 2004-07-14 01:52 ┃┗[shugo ruby-lang.org ] 強い型の言語とクロージャ 84 2004-07-14 15:02 ┃ ┣[takuo aya.or.jp ] 86 2004-07-14 23:32 ┃ ┃┗[shugo ruby-lang.org ] 85 2004-07-14 20:52 ┃ ┗[randy mvd.biglobe.ne] 87 2004-07-14 23:59 ┃ ┗[shugo ruby-lang.org ] 88 2004-07-15 00:04 ┃ ┣[shugo ruby-lang.org ] 89 2004-07-15 01:50 ┃ ┗[nobsun sampou.org ] 90 2004-07-15 11:04 ┃ ┗[shugo ruby-lang.org ] 79 2004-07-13 14:43 ┗[matz ruby-lang.org ]