Object
Aからobject
BへAに関する情報を含むメッセージを送り、その情報に基づいてBがある変化をする、というような場合、どのように記述するべきでしょうか?Object特異的な情報を含むメッセージをそのObjectから発信する方法についてです。何冊かの本を読んだのですがはっきり触れていませんでした。2004年12月末から2005年1月に掛けてのKondo
Fumito, Kazuhiro ABE, Takashi Yamamiyaさんたちの議論はこの問題に関するものだと思うのですが、殆んど文字化けしていて読めませんでした。あるいは、Smalltalkにはこのような機能はないのでしょうか?
鶴井 博理
Hiromichi Tsurui MD, PhD
Dept. Pathology, Juntendo University Phone:81-3-5802-1039 Fax:81-3-3813-3164 [hidden email] |
こんにちは、阿部です。
ここでいう「Bがある変化をする」とは、単にBの属性値が変化するだけでなく、Aの情報をもとにBの振る舞いが変わるという解釈でよいでしょうか。 また、オブジェクト特異的ということなので、Bのみが変化するのであって、Bが属するクラスおよびそのインスタンスは変化しないということですね。 そのような場合、Squeak Smalltalkのインスタンスに、assureUniClassメッセージを送ることでインスタンス特異的クラスを得ることができます。このクラスに特異的メソッドを追加するには、compile:classified:を送ります。このとき、compile:の引数はソースコードの文字列、classified:の引数は任意のメソッドカテゴリ(プロトコル)の文字列です。したがって、このソースコードにAの情報を含めれば目的は達すると思われます。 詳しくは以下の鷲見さんの解説を参照してください。 http://d.hatena.ne.jp/sumim/20060420/p1 なお、2004年末の議論は、マルチエージェントの扱いに関するもので、今回の話とは直接関係ないと思います。 //abee -- 阿部 和広 EMAIL [hidden email] 08/05/10 に Hiromichi Tsurui<[hidden email]> さんは書きました: > > Object Aからobject > BへAに関する情報を含むメッセージを送り、その情報に基づいてBがある変化をする、というような場合、どのように記述するべきでしょうか?Object特異的な情報を含むメッセージをそのObjectから発信する方法についてです。何冊かの本を読んだのですがはっきり触れていませんでした。2004年12月末から2005年1月に掛けてのKondo > Fumito, Kazuhiro ABE, Takashi > Yamamiyaさんたちの議論はこの問題に関するものだと思うのですが、殆んど文字化けしていて読めませんでした。あるいは、Smalltalkにはこのような機能はないのでしょうか? > > 鶴井 博理 > Hiromichi Tsurui MD, PhD > Dept. Pathology, > Juntendo University > Phone:81-3-5802-1039 > Fax:81-3-3813-3164 > [hidden email] |
In reply to this post by Hiromichi Tsurui
山宮です。
Hiromichi Tsurui wrote: > Object Aからobject BへAに関する情報を含むメッセージを送り、その情報に基 > づいてBがある変化をする、というような場合、どのように記述するべきでしょ > うか?Object特異的な情報を含むメッセージをそのObjectから発信する方法につ > いてです。何冊かの本を読んだのですがはっきり触れていませんでした。 「メッセージ」や、「Object特異的」と言った言葉は、一般で使われる意味と Smalltalk 言語の文脈の使われ方が違う時がありますので、 Object A, B やメッセージの具体例を挙げて頂くか、背景にある問題を教えて 頂ければお話が分かりやすくなると思います。 -- Takashi Yamamiya := http://metatoys.org/ |
阿部さん、山宮さん、早速のお返事ありがとうございます。 例として、月と地球の運動をシミュレートすることを考えています。それぞれは、インスタンス変数として、質量、現在位置及び現在の速度を持つとします。月は、現在の地球の位置と質量(これは一回伝達されれば十分ですが)の情報が得られると、自身の質量、位置、速度から微小時間後の位置、速度が求まります。地球に関しても同じことです。この微小時間のメッセージのやり取り繰りを返すことにより有限時間での両者の動きをシミュレートしたいと考えているわけです。端的に言って、地球がその質量及び位置を月へ、月がその質量及び位置を地球へ直接に伝達する方法はないのでしょうか、という質問です。assureUniClass, compile: classified:を用いますと、(まだ十分把握できてい ないのですが)、間に介在するものが、月の位置を月から聞き出して地球に教え、地球の位置を地球から聞き出しつきに教える、という形になるような気がいたします。より一般的には、Object間で直接情報のやり取りをする方法はあるのでしょうか、ということになります。 鶴井 > 山宮です。 > > Hiromichi Tsurui wrote: >> Object Aからobject BへAに関する情報を含むメッセージを送り、その情報に基 >> づいてBがある変化をする、というような場合、どのように記述するべきでしょ >> うか?Object特異的な情報を含むメッセージをそのObjectから発信する方法につ >> いてです。何冊かの本を読んだのですがはっきり触れていませんでした。 > > 「メッセージ」や、「Object特異的」と言った言葉は、一般で使われる意味と > Smalltalk 言語の文脈の使われ方が違う時がありますので、 > Object A, B やメッセージの具体例を挙げて頂くか、背景にある問題を教えて > 頂ければお話が分かりやすくなると思います。 > > -- > Takashi Yamamiya := http://metatoys.org/ > こんにちは、阿部です。 > ここでいう「Bがある変化をする」とは、単にBの属性値が変化するだけでなく、Aの情報をもとにBの振る舞いが変わるという解釈でよいでしょうか。 > また、オブジェクト特異的ということなので、Bのみが変化するのであって、Bが属するクラスおよびそのインスタンスは変化しないということですね。 > そのような場合、Squeak Smalltalkのインスタンスに、assureUniClassメッセージを送ることでインスタンス特異的クラスを得ることができます。このクラスに特異的メソッドを追加するには、compile:classified:を送ります。このとき、compile:の引数はソースコードの文字列、classified:の引数は任意のメソッドカテゴリ(プロトコル)の文字列です。したがって、このソースコードにAの情報を含めれば目的は達すると思われます。 > 詳しくは以下の鷲見さんの解説を参照してください。 > http://d.hatena.ne.jp/sumim/20060420/p1 > > なお、2004年末の議論は、マルチエージェントの扱いに関するもので、今回の話とは直接関係ないと思います。 > > //abee > -- > 阿部 和広 EMAIL [hidden email] > > 08/05/10 に Hiromichi Tsurui<[hidden email]> さんは書きました: >> >> Object Aからobject >> BへAに関する情報を含むメッセージを送り、その情報に基づいてBがある変化をする、というような場合、どのように記述するべきでしょうか?Object特異的な情報を含むメッセージをそのObjectから発信する方法についてです。何冊かの本を読んだのですがはっきり触れていませんでした。2004年12月末から2005年1月に掛けてのKondo >> Fumito, Kazuhiro ABE, Takashi >> Yamamiyaさんたちの議論はこの問題に関するものだと思うのですが、殆んど文字化けしていて読めませんでした。あるいは、Smalltalkにはこのような機能はないのでしょうか? |
こんにちは、阿部です。
そういうことでしたら、単にメッセージの引数として必要なオブジェクトを渡してやればよいように思います。 月 位置と速度を計算する: 地球. のような感じです。 //abee -- 阿部 和広 EMAIL [hidden email] 08/05/10 に Hiromichi Tsurui<[hidden email]> さんは書きました: > > 阿部さん、山宮さん、早速のお返事ありがとうございます。 > > 例として、月と地球の運動をシミュレートすることを考えています。それぞれは、インスタンス変数として、質量、現在位置及び現在の速度を持つとします。月は、現在の地球の位置と質量(これは一回伝達されれば十分ですが)の情報が得られると、自身の質量、位置、速度から微小時間後の位置、速度が求まります。地球に関しても同じことです。この微小時間のメッセージのやり取り繰りを返すことにより有限時間での両者の動きをシミュレートしたいと考えているわけです。端的に言って、地球がその質量及び位置を月へ、月がその質量及び位置を地球へ直接に伝達する方法はないのでしょうか、という質問です。assureUniClass, > compile: classified:を用いますと、(まだ十分把握できてい > ないのですが)、間に介在するものが、月の位置を月から聞き出して地球に教え、地球の位置を地球から聞き出しつきに教える、という形になるような気がいたします。より一般的には、Object間で直接情報のやり取りをする方法はあるのでしょうか、ということになります。 > > > > 鶴井 |
In reply to this post by Hiromichi Tsurui
鶴井さん
> 例として、月と地球の運動をシミュレートすることを考えています。それぞれは、インスタンス変数として、質量、現在位置及び現在の速度を持つとします。月は、現在の地球の位置と質量(これは一回伝達されれば十分ですが)の情報が得られると、自身の質量、位置、速度から微小時間後の位置、速度が求まります。地球に関しても同じことです。この微小時間のメッセージのやり取り繰りを返すことにより有限時間での両者の動きをシミュレートしたいと考えているわけです。端的に言って、地球がその質量及び位置を月へ、月がその質量及び位置を地球へ直接に伝達する方法はないのでしょうか、という質問です。assureUniClass, compile: classified:を用いますと、(まだ十分把握できてい > ないのですが)、間に介在するものが、月の位置を月から聞き出して地球に教え、地球の位置を地球から聞き出しつきに教える、という形になるような気がいたします。より一般的には、Object間で直接情報のやり取りをする方法はあるのでしょうか、ということになります。 オブジェクト間のやりとりというものは、すべて「メッセージ」という概念 で抽象化されていますが、メッセージには「引数」を付けて送ることができ、 メッセージ送信者自身を現す"self"を含め、送信者が「知っている」(送信者 が参照可能である)任意のオブジェクト、またはそれらを含む任意の式を引数 とすることができます。というわけで、阿部さんの言うように一般的には b message: self. というメッセージをaが実行すれば良いことになります。 が、重力のシミュレーションのときはもう少し工夫が必要でしょうね。 月 位置と速度を計算する: 地球. 地球 位置と速度を計算する: 月. という二つの式を順番に実行するとしたとき、最初の式を実行した時点で月の 位置と速度が時刻tにおけるものでなくt+dにおけるものになってしまった場合、 下の式で地球の位置が間違ったものになってしまいます。また、いずれ3体以 上のものをシミュレートしたくなるのが人情ですので、存在する質点のリスト を管理する「仲介者」のようなオブジェクトを用意して、それぞれの質点の一 ステップ前の値を覚えておくか、それぞれのオブジェクトが新しい値と古い値 の両方を持てるようにすることが考えられます。 さらには重力の伝播速度を考 慮したくなると、メッセージの引数のひとつに時間を指定できるようにしたく なったりするかもしれません。その場合質点オブジェクトに時刻tにおける位 置を返す positionAtTimeT: t のようなメソッドを定義して、内部で以前の位置を(補完して返す)ということ になるでしょうか。(もちろん3体以上の問題では物理的に正確なシミュレーショ ンは不可能ですが、それでも楽しければよいですし、それなりに良い結果を得 ることはできると思います。) Squeak/Smalltalk側のことに関しては、梅澤さんの書かれた本、「自由自在 Squeakプログラミング」などを参考にすると良いのではないかと思います。 (思うに、これはEtoysでやりたいという話ではなく、Smalltalkで、という ことで良かったのですよね。) -- Yoshiki |
In reply to this post by Kazuhiro ABE-3
阿部さん、何時もながら迅速な応答をありがとうございます。 メッセージが引数として受信側と同じクラスのものを送れるとは思いも拠りませんでした。 このような扱いが可能でしたら、object間の極めて複雑な相互作用も扱える、ということですね。 早速トライしてみます。 > こんにちは、阿部です。 > そういうことでしたら、単にメッセージの引数として必要なオブジェクトを渡してやればよいように思います。 > > 月 位置と速度を計算する: 地球. > > のような感じです。 > > //abee > -- > 阿部 和広 EMAIL [hidden email] > > 08/05/10 に Hiromichi Tsurui<[hidden email]> さんは書きました: >> >> 阿部さん、山宮さん、早速のお返事ありがとうございます。 >> >> 例として、月と地球の運動をシミュレートすることを考えています。それぞれは、インスタンス変数として、質量、現在位置及び現在の速度を持つとします。月は、現在の地球の位置と質量(これは一回伝達されれば十分ですが)の情報が得られると、自身の質量、位置、速度から微小時間後の位置、速度が求まります。地球に関しても同じことです。この微小時間のメッセージのやり取り繰りを返すことにより有限時間での両者の動きをシミュレートしたいと考えているわけです。端的に言って、地球がその質量及び位置を月へ、月がその質量及び位置を地球へ直接に伝達する方法はないのでしょうか、という質問です。assureUniClass, >> compile: classified:を用いますと、(まだ十分把握できてい >> ないのですが)、間に介在するものが、月の位置を月から聞き出して地球に教え、地球の位置を地球から聞き出しつきに教える、という形になるような気がいたします。より一般的には、Object間で直接情報のやり取りをする方法はあるのでしょうか、ということになります。 >> >> >> >> 鶴井 > |
In reply to this post by Yoshiki Ohshima-2
Yoshikiさん
懇切なお返事ありがとうございます。 > オブジェクト間のやりとりというものは、すべて「メッセージ」という概念 > で抽象化されていますが、メッセージには「引数」を付けて送ることができ、 > メッセージ送信者自身を現す"self"を含め、送信者が「知っている」(送信者 > が参照可能である)任意のオブジェクト、またはそれらを含む任意の式を引数 > とすることができます。というわけで、阿部さんの言うように一般的には > > b message: self. > > というメッセージをaが実行すれば良いことになります。 この場合、送信者aを指定するにはどうすれば宜しいですか? 送信者は暗黙にプログラマーだけかと思っていました。GUIでのevent handlingで予め用意されている場合以外は。 > が、重力のシミュレーションのときはもう少し工夫が必要でしょうね。 > > 月 位置と速度を計算する: 地球. > 地球 位置と速度を計算する: 月. > > という二つの式を順番に実行するとしたとき、最初の式を実行した時点で月の > 位置と速度が時刻tにおけるものでなくt+dにおけるものになってしまった場合、 > 下の式で地球の位置が間違ったものになってしまいます。また、いずれ3体以 > 上のものをシミュレートしたくなるのが人情ですので、存在する質点のリスト > を管理する「仲介者」のようなオブジェクトを用意して、それぞれの質点の一 > ステップ前の値を覚えておくか、それぞれのオブジェクトが新しい値と古い値 > の両方を持てるようにすることが考えられます。 > さらには重力の伝播速度を考 > 慮したくなると、メッセージの引数のひとつに時間を指定できるようにしたく > なったりするかもしれません。その場合質点オブジェクトに時刻tにおける位 > 置を返す > > positionAtTimeT: t > > のようなメソッドを定義して、内部で以前の位置を(補完して返す)ということ > になるでしょうか。(もちろん3体以上の問題では物理的に正確なシミュレーショ > ンは不可能ですが、それでも楽しければよいですし、それなりに良い結果を得 > ることはできると思います。) > Squeak/Smalltalk側のことに関しては、梅澤さんの書かれた本、「自由自在 > Squeakプログラミング」などを参考にすると良いのではないかと思います。 今、読ませていただいています。 > (思うに、これはEtoysでやりたいという話ではなく、Smalltalkで、という > ことで良かったのですよね。) VisualWorksでJunを動かしています。 鶴井 |
In reply to this post by Hiromichi Tsurui
こんにちは、阿部です。
Smallralkの場合、メッセージを受け取るレシーバも、送るセンダも、その引数もすべてオブジェクトであり、それが特定のクラスに属す必要があるなどの制約はありません。 もし、引数にレシーバと同じクラスのインスタンスが使えないとなると、3 + 4も計算できないことになります(3と4はいずれもSmallIntegerのインスタンス。3がレシーバで+ 4がメッセージ。+がメッセージセレクタで、4がその引数。センダはコンテキストに依存。もしワークスペースでdo itしたならnil。レシーバは受け取ったメッセージのセレクタにマッチするメソッドを探索して実行します)。 もしかすると、Smalltalk(とそのオブジェクト指向)の考え方に関して、すこしずれがあるのかもしれません。たとえば、青木淳さんの「オブジェクト指向システム分析設計入門」や「Smalltalkイディオム」をお読みになることをお勧めします。これらの本は絶版ですが、幸いなことにWebで全文が公開されています。 http://www.sra.co.jp/people/aoki/IntroductionToOOAOOD/index.htm http://www.sra.co.jp/people/aoki/SmalltalkIdioms/index.htm //abee -- 阿部 和広 EMAIL [hidden email] 08/05/11 に Hiromichi Tsurui<[hidden email]> さんは書きました: > 阿部さん、何時もながら迅速な応答をありがとうございます。 > メッセージが引数として受信側と同じクラスのものを送れるとは思いも拠りませんでした。 > このような扱いが可能でしたら、object間の極めて複雑な相互作用も扱える、ということですね。 > 早速トライしてみます。 |
阿部さん
何時もながら迅速にして適切なな応答をありがとうございます。 「Smalltalkイディオム」は読み始めたところです。「オブジェクト指向システム分析設計入門」は以前読もうとしてややハードルが高く感じたのですが、おいおい目を通すようにします。 鶴井 > こんにちは、阿部です。 > Smallralkの場合、メッセージを受け取るレシーバも、送るセンダも、その引数もすべてオブジェクトであり、それが特定のクラスに属す必要があるなどの制約はありません。 > もし、引数にレシーバと同じクラスのインスタンスが使えないとなると、3 + > 4も計算できないことになります(3と4はいずれもSmallIntegerのインスタンス。3がレシーバで+ > 4がメッセージ。+がメッセージセレクタで、4がその引数。センダはコンテキストに依存。もしワークスペースでdo > itしたならnil。レシーバは受け取ったメッセージのセレクタにマッチするメソッドを探索して実行します)。 > もしかすると、Smalltalk(とそのオブジェクト指向)の考え方に関して、すこしずれがあるのかもしれません。たとえば、青木淳さんの「オブジェクト指向システム分析設計入門」や「Smalltalkイディオム」をお読みになることをお勧めします。これらの本は絶版ですが、幸いなことにWebで全文が公開されています。 > > http://www.sra.co.jp/people/aoki/IntroductionToOOAOOD/index.htm > http://www.sra.co.jp/people/aoki/SmalltalkIdioms/index.htm > > //abee > -- > 阿部 和広 EMAIL [hidden email] > > 08/05/11 に Hiromichi Tsurui<[hidden email]> さんは書きました: >> 阿部さん、何時もながら迅速な応答をありがとうございます。 >> メッセージが引数として受信側と同じクラスのものを送れるとは思いも拠りませんでした。 >> このような扱いが可能でしたら、object間の極めて複雑な相互作用も扱える、ということですね。 >> 早速トライしてみます。 > |
In reply to this post by Hiromichi Tsurui
鶴井さん
> > オブジェクト間のやりとりというものは、すべて「メッセージ」という概念 > > で抽象化されていますが、メッセージには「引数」を付けて送ることができ、 > > メッセージ送信者自身を現す"self"を含め、送信者が「知っている」(送信者 > > が参照可能である)任意のオブジェクト、またはそれらを含む任意の式を引数 > > とすることができます。というわけで、阿部さんの言うように一般的には > > > > b message: self. > > > > というメッセージをaが実行すれば良いことになります。 > この場合、送信者aを指定するにはどうすれば宜しいですか? > 送信者は暗黙にプログラマーだけかと思っていました。GUIでのevent handlingで予め用意されている場合以外は。 あるメソッドの中でaという変数にあるオブジェクトが束縛されているなら、 b message: a と書けばよいということでしょうか。 (私の書いたのは微妙に間違いがあって、「送信者を現すself」と書いたの は話をややこしくしたかもしれません。厳密に言えば「送信者」は「メソッド を実行しているコンテキスト」ということになりますので。ただ、その辺は今 はあまり気にする必要はないと思われます。) 例えばWorkspaceとTranscriptを開き(VisualWorksならデフォルトですで に開かれていると思いますが)、Workspaceのほうに Transcript show: 'abc'. と書いてdo it したり、 Transcript show: 3 printString. と書いてdo it したり、 | a b | a := 'abc'. b := 'def'. Transcript show: a. Transcript space. Transcript show: b. Transcript space. Transcript show: a, b. という8行を書いてそれを選択してdo it してみてください。aやbやそれを演 算した結果をTranscriptオブジェクトへのメッセージ送信に付加できることが わかるかと思います。 -- Yoshiki |
Yoshikiさん 懇切なお返事ありがとうございます。 メッセージの引数としてobjectをとれ、その結果object間で極めて一般的な情報のやり取りができることがわかりました。 このことを年頭におきますと、プログラムの記述が見通しが良く簡潔になることが納得できます。 鶴井 > 鶴井さん > >> > オブジェクト間のやりとりというものは、すべて「メッセージ」という概念 >> > で抽象化されていますが、メッセージには「引数」を付けて送ることができ、 >> > メッセージ送信者自身を現す"self"を含め、送信者が「知っている」(送信者 >> > が参照可能である)任意のオブジェクト、またはそれらを含む任意の式を引数 >> > とすることができます。というわけで、阿部さんの言うように一般的には >> > >> > b message: self. >> > >> > というメッセージをaが実行すれば良いことになります。 >> この場合、送信者aを指定するにはどうすれば宜しいですか? >> 送信者は暗黙にプログラマーだけかと思っていました。GUIでのevent handlingで予め用意されている場合以外は。 > > あるメソッドの中でaという変数にあるオブジェクトが束縛されているなら、 > > b message: a > > と書けばよいということでしょうか。 > > (私の書いたのは微妙に間違いがあって、「送信者を現すself」と書いたの > は話をややこしくしたかもしれません。厳密に言えば「送信者」は「メソッド > を実行しているコンテキスト」ということになりますので。ただ、その辺は今 > はあまり気にする必要はないと思われます。) > > 例えばWorkspaceとTranscriptを開き(VisualWorksならデフォルトですで > に開かれていると思いますが)、Workspaceのほうに > > Transcript show: 'abc'. > > と書いてdo it したり、 > > Transcript show: 3 printString. > > と書いてdo it したり、 > > | a b | > a := 'abc'. > b := 'def'. > Transcript show: a. > Transcript space. > Transcript show: b. > Transcript space. > Transcript show: a, b. > > という8行を書いてそれを選択してdo it してみてください。aやbやそれを演 > 算した結果をTranscriptオブジェクトへのメッセージ送信に付加できることが > わかるかと思います。 > > -- Yoshiki > |
Free forum by Nabble | Edit this page |