langsmith:85
From: randy <randy mvd.biglobe.ne.jp>
Date: Wed, 14 Jul 2004 20:52:35 +0900
Subject: [langsmith:85] Re: 強い型の言語とクロージャ
randyです。 > あまり関係ないのですが、強い型の言語にクロージャを導入した場合、型の扱い > はどうするのが望ましいでしょう。 > > たとえば、C#に将来追加されるクロージャ(匿名メソッド)の場合、あらかじめ、 > > public delegate bool Foo(int i, string s); > > のようにクロージャの型(delegate)を定義しておいて、 > > public void Bar(Foo foo) > { > ... > } > > public void Baz() > { > Bar(new Foo(i, s) { > ... > }); > } > あらかじめ型を定義させる代りに、 > > // C#風の上手い文法が思いつきませんでしたが、boolが戻り値の型です > public void Bar(Closure<bool, int, string> foo) > { > ... > } > > public void Baz() > { > Bar(new Closure<bool, int, string>(i, s) { > ... > }); > } > > のように、シグニチャが一致したら型適合する、というような行き方もあるのか > なと思ったのですが、C#のような名前による型適合の言語だと、前者の方が自然 > でしょうか。 前者の記法と、後者の記法って対立する概念 なのでしょうか? メソッドの型に名前をつけるかつけないかという 問題に思えるのですが。(「名前付きメソッド」と 「匿名メソッド」が別に対立する概念ではないのと おなじように、「名前付き、メソッドの型」と 「匿名、メソッドの型」とがあってもいいような気が。) > public delegate bool Foo(int i, string s); がメソッドの型に名前をつける方法だとすると、 public void Bar(delegate bool(int, string) foo){ ... } のように、匿名の「メソッドの型」も同時に存在していい気がします。 (delegateでなくてもいいんですが(closureとか)、前者の記法に あわせてみました。) この場合、この「匿名の「メソッドの型」」を持つメソッドを いかに作成(new)するのかというのが問題なのだと思います。 以下の書き方ではどうでしょう。 public void Baz() { Bar(new delegate bool(int i, string s){ // メソッドの型に名前を付けない方 法。 ... }); Bar(new Foo(i, s){ // こっちも同時に可能。 }); } randy randy mvd.biglobe.ne.jp randy users.sourceforge.jp -- 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 ]