ロランとディアナ
ここからの続き
人格形成ゲームはお好きですか? Squeak の世界にロランを作ってみるというのは、どうでしょう。3 とか 4 とかに刺激を与えるよりはロランを作って刺激を与えて反応を見る方がずっとそれっぽいかと(笑)。--sumim - 2002-06-06, 18:28:17
ほぇ? 実はやったことないです(^-^;)。--さ茂 - 2002-06-06, 18:30:58
- 実は私も…(^_^;)。>人格形成 --sumim
Object subclass: #'ムーンレイス' instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'ターンA-ガンダム'
を Workspace でも FileList でも空いているところにコピペして、続けて do-it (コマンド + d )してみてください。--sumim - 2002-06-06, 18:41:42
念のため別imageにしてdo-itしました。--さ茂 - 2002-06-06, 18:46:01
次に、別の空白行に「ロラン」と入力して、print-it してみてください。メニューが出るので declare Global を選んでください。 --sumim - 2002-06-06, 18:48:38
PluggableTextMorph subclass: #NaiveTextMorph
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Morphic-Windows'!
……に似てますね?--さ茂 - 2002-06-06, 18:49:07
ご明察(笑)。--sumim
おっと、書き込みがクロスしましたが、Nilが出ました。--さ茂 - 2002-06-06, 18:51:30
nil ですね。Squeak/Smalltalk の世界では大文字と小文字を区別するので気を付けてください。次に、「ロラン _ ムーンレイス new」と新しい行に入力して do-it してみてください。これで Squeak の世界にロランが誕生します。--sumim - 2002-06-06, 18:56:09
do-itしたら、コマンドPで「ロラン a ムーンレイス」と出ました。
徐々にではありますが、何が起こっているのかわかってきたような気がします(^-^;)。--さ茂 - 2002-06-06, 19:00:38
ちょっと面倒なので、色を変えずにいきます。さ茂さんはお時間は、大丈夫ですか? --sumim - 2002-06-06, 19:01:51
読みにくいので色を変えました。--さ茂
晩ご飯はもうちょっと後です(^-^;)。
それにしても通信講座みたい(^-^;)。ありがたいですm(_ _)m。--さ茂 - 2002-06-06, 19:06:41
じゃ、ご飯までちょっとだけロランで遊んでみましょう。--sumim - 2002-06-06, 19:07:36
新しい行に、「ロラン 瞳の色は?」と書いて print-it してみてください。--sumim - 2002-06-06, 19:11:59
う、バグりました(T-T)。--さ茂 - 2002-06-06, 19:15:24
いえ、いいのです。ノーティファイアと呼ばれるエラーメッセージを表示するためのウインドウが表示されませんか? そのタイトルは「MessageNotUnderstood: 瞳の色は?」のはずです。--sumim - 2002-06-06, 19:17:10
このノーティファイアは無害なので、邪魔なら消してしまってもかまいませんし、開いたままでも大丈夫です。--sumim - 2002-06-06, 19:18:30
これは、ロランが「瞳の色は?」という刺激(問いかけ)に対して「?!」という反応を返したのだと思ってください。知らないことを訊かれてびっくりしたのです。--sumim - 2002-06-06, 19:19:54
「MessageNotUnderstood: contractTo:」です。
わたしのSqueakは日本語版の機能限定解除+FileLIst・Scamper改造版です。
環境が違うからかな?--さ茂 - 2002-06-06, 19:22:57
それは?が半角だからだと思います。上のコピペでやってみてください。--sumim - 2002-06-06, 19:24:35
コピペでも駄目でした(T-T)。無視して進めますか?--さ茂 - 2002-06-06, 19:30:02
(! --abee) - 2002-06-06, 19:32:01
「ロラン あ」を print it したらどうなりますか? --sumim - 2002-06-06, 19:32:18
Unkown selector,please confirm,correct,or cancel
というメニューが出ただけでした。--さ茂 - 2002-06-06, 19:37:16
オッケーです。「ロラン 瞳」ではどうでしょう? これで同じメニューが出てくれるようなら、瞳で進めます。--sumim - 2002-06-06, 19:38:54
同じメニューが出ました。もちろんどちらもキャンセルしました。--さ茂 - 2002-06-06, 19:40:44
では「瞳の色は?」を「瞳」に置き換えて再開です。「ロラン 瞳」を print-it して、瞳をメニューから選んでみてください。うまく行けば「MessageNotUnderstood: 瞳」が出るはずです。--sumim - 2002-06-06, 19:41:59
選んだ瞬間出ました「MessageNotUnderstood: 瞳」--さ茂 - 2002-06-06, 19:43:43
うっかりしていました。そう、メニューはいっかいきりです。今度は大丈夫みたいですね。これがロランが発した「?!」です。申し上げるまでもありませんが、ロランは「瞳」という刺激に対してどう対処したらよいか知らないのでこうした反応を示します。で、知らないものは教えてやろう、ということになります。--sumim - 2002-06-06, 19:45:40
ロランを選択して browse-it (コマンド + b ) してみてください。あと、お食事の時間になったら、遠慮せずにおっしゃってください。--sumim - 2002-06-06, 19:47:09
(! --abee) - 2002-06-06, 19:49:20
まだですm(_ _)m。で、System Browser: ムーンレイス 開きました。--さ茂 - 2002-06-06, 19:50:08
no-messages をクリックしてみてください。下に、
message selector and argument names
"comment stating purpose of message"
| temporary variable names |
statements
と出るはずです。構わず、delete キーで消してしまい、
瞳
"瞳の色を答える"
^ '青'
をコピペして入れ、accept (コマンド + s ) してください。--sumim - 2002-06-06, 19:52:57
accept ができたら「ロラン 瞳」を今一度、print-it してみてください。こんどはノーティファイアは出ず、すんなり '青' と表示されるはずです。で、ここまでの流れをちょっと振り返って、何が起こったか整理してみましょう。--sumim - 2002-06-06, 19:55:04
acceptしようとしたら「Please type your initals:」と出ました。
何と入力すればよいのでしょうか?--さ茂 - 2002-06-06, 20:31:02
- これは著者を識別をするためのイニシャルなので、なんでも構いません。--abee
遅くなってすいません。えっと、私は samo さんと密かに(勝手に)お呼びしていたのですが、sashige さんですか? sashigeru ?(笑) いまさらすみません…(^_^;)。いずれにせよ、それを入れて以後、Squeak コミュニティではそれで通してください。日本語はやめておいたほうがいいと思います。--sumim - 2002-06-06, 20:57:53
あと、abee さんが急遽、MessageNotUnderstood: contractTo: 障害を克服するパッチを作ってくださったので、こちらからダウンロードして file-in してみてください。今度は「瞳の色は?」とすると「MessageNotUnderstood: 瞳の色は?」というノーティファイアが出るはずです。--sumim - 2002-06-06, 21:16:24
OSXアップデートなんかして間が空いてしまいましたm(_ _)m。
>日本語はやめておいたほうがいいと思います。
了解しました。旧ハンドルのshigerusで通します。
>MessageNotUnderstood: contractTo: 障害を克服するパッチ
さっそくインストールしますm(_ _)m。--ここではさ茂 - 2002-06-06, 22:19:55
インストールされたら、「ロラン 瞳の色は?」の結果を教えてください。--sumim - 2002-06-06, 22:27:11
やってみました。答えは'青'。パッチもうまくいきました。
で、疑問がふつふつと……。
Object subclass: #'ムーンレイス' でサブクラス?'ムーンレイス'を作りました。
が、ブラウザではこれの上に、Object subclass: #NameOfSubclassが存在します。作ったことないのに?
で、さらにロランという新しいオブジェクト(nilでなくムーンレイスのロラン)はどこにあるのかわかりません?
なのに「ロラン 瞳の色は?」ではちゃんと青と答えます。ロランはどこにいるのか?
(万が一、∀ファンが見てるとあれなんで(^-^;)。実はロランの目は緑色なんです。わたしも気づかず……(^-^;))
頭がこんがらがってるので、整理します。
まず、カテゴリーがターンAガンダムというオブジェクト(サブクラス)・ムーンレイスを作って、ロランというオブジェクトを作りました。で、ロランはムーンレイスだと教えました。(関連づけ?)
次にロランの瞳が何色か質問したら質問の意味を知らずにノーティファイアを出しちゃうので、「この刺激に対する反応の返し方」を教えました。
ですが、ロランというオブジェクトはどこにも見えません。
'ムーンレイス'や瞳の色'青'などはブラウザ上で見えるのに?
はてさて?
<またもや明日早いので今夜もこのへんで。
今夜もいろいろ教えていただいてありがとうございました。明日、ご都合さえ合えばまたよろしくお願いいたしますm(_ _)m。--さ茂 - 2002-06-06, 23:02:37
(^_^;)。ディアナ様に繋げることばかり考えていたら無意識に青に…。緑に直しておいてください(笑)。こちらこそ、楽しかったです。実は、そんなに複雑なことはしていません。逆に、あまり複雑に考えるとこんがらがるので、他のコンピュータ環境のことは忘れて、なるべくシンプルに考える癖を付けていただければ幸いです。おやすみなさい。また、明日。abee さんも、ありがとうございました。--sumim - 2002-06-06, 23:12:40
まず、ムーンレイスというオブジェクトを作りました。
Object subclass: #'ムーンレイス'...
このオブジェクト「ムーンレイス」に new という刺激を与えると「あるムーンレイス(a ムーンレイス)」というオブジェクトが飛び出してきます。
ムーンレイス new
それをすかさず捕まえて“ロラン”と名付けました。
ロラン _ ムーンレイス new
ロラン(あるムーンレイス)は、「瞳の色は?」という刺激(この場合は「メッセージ」と言った方がふさわしいですね)にどう対処してよいか知りません。
ロラン 瞳の色は? …… 「MessageNotUnderstood: 瞳の色は?」
そこで「瞳の色は?」と尋ねられたら「'緑'」と答えなさいというふうに教えたわけです。
瞳の色は?
"瞳の色を答える"
^ '緑'
すると、ロランは「瞳の色は?」と尋ねられると「'緑'」と答えられるようになります。
ロラン 瞳の色は? …… '緑'
めでたし、めでたし。しかし、ムーンレイスはロランだけではありません。
ディアナ _ ムーンレイス new
でディアナ様を作りましょう。ディアナ様もムーンレイスです。では瞳の色は?
ディアナ 瞳の色は? …… '緑'
お答えはいただけましたが、その内容が間違っています。ディアナ様は青い目をしておられるはず。まず、どうしてディアナ様は、ロランのときは教えなければいけなかった「瞳の色は?」というメッセージに答えられたのでしょう? また、ディアナ様は青、ロランには緑の瞳を持たせるにはどうしたらよいのでしょうか? --sumim - 2002-06-06, 23:44:12
おはようございます。よろしく気長にお付き合い下さいましm(_ _)m。
さて、ロランというのは、ムーンレイスに付けられた変数でしたね。
変数というのは、オブジェクトと違ってブラウザ上ではあくまでムーンレイスとしてしか見えない。間違ってますか?
この場合、同じ(共通の)オブジェクトに異なる変数を設定するということですよね?
ムーンレイスはロランもいるしディアナもいる。
瞳の色は? という質問はディアナ=ムーンレイス=ロラン、で答えは緑。
どのムーンレイスか? それによってメッセージへの答えを変える必要があるのですね?
瞳
"瞳の色を答える"
^ '緑'
の中に、ムーンレイスの名前が何々だったら……というif分岐を付けなきゃ駄目ですよね?
うーん。難しい……。
ところで、sumimさん∀お詳しい(^-^)。ディアナの次はソシエで、茶ですか?寝ぼけておりました(^-^;)。サブクラス・地球人をつくらなきゃこれはだめでしたね 大丈夫です。ソシエもグエンもあとでちゃんと登場します(笑)--sumim 個人的にはテテスで赤、というのもお薦めします(?)。--さ茂 - 2002-06-07, 06:29:03
テテスは可愛そうでしたね…(^_^;)。さて気を取りなして(笑)。browser で「瞳の色は?」を選択(browser を閉じてしまっていたら「瞳の色は?」を選択してコマンド + m でもいいです)して、
瞳の色は?
"瞳の色を答える"
(self == ロラン) ifTrue: [ ^ '緑' ].
(self == ディアナ) ifTrue: [ ^ '青' ].
^ '黒'
と書き換えるか、コピペして accept してください。これでロランは '緑'、ディアナは '青' とその瞳の色を答えてくれるはずです。--sumim
では、お座なりにしてしまった さ茂さんが抱えておられるいくつかの疑問を解決するためにも、3 や 4 に刺激を与えていた頃まで遡って、ここまでを整理してみましょう。negated はオブジェクトではなく刺激の名前だということはご理解いただけましたか? そう。「瞳の色は?」と同じです。ためしに、「4 瞳の色は?」としてみてください。もちろん 4 は「瞳の色は?」という刺激を理解しないので、例の「MessageNotUnderstood: 瞳の色は?」という「?!」的な反応を返してきます。これはムーンレイスたちも同じで、「ロラン negated」を pirnt-it しても同様の結果になるでしょう。
ちなみに、ロランなどのムーンレイスたちは negated という刺激を知らないだけなので「瞳の色は?」同様、教えてやれば反応できるようになります。ムーンレイスに browser で、
negated
^ 'もうだめ…'
と「瞳の色は?」のときと同じ要領で入力して accept すれば、以後、「ロラン negated」にも反応が返ってくるようになります。
そこで考えていただきたいのが Object subclass: ... という命令によって Squeak に組み込まれた「ムーンレイス」という名のオブジェクトと、そのムーンレイスに new という刺激を与えて作ったロランやディアナといった“ムーンレイスたち”との関係。そして、それぞれの Squeak 世界における役割り(位置づけ)です。--sumim - 2002-06-07, 14:27:16
上では、ムーンレイスたちには「瞳の色は?」といった刺激を与えて反応を得ることができましたが、オブジェクト「ムーンレイス」には new という刺激を与えただけで「瞳の色は?」については試してみていませんよね。では、「ムーンレイス 瞳の色は?」とすると…。なんと「?!」的な反応が返ってきす。ムーンレイスにはすでに「瞳の色は?」という刺激に対する反応の仕方を教えてあるはず…なのにどうしてとぼけるのでしょう? それとも本当に知らない?--sumim - 2002-06-07, 15:56:07
面白がってテテス=赤まで追加しちゃいました(^-^;)。<不真面目な生徒m(_ _)m。
何となくわかってきました。ロランたちは、グローバル変数ですね?
試しにムーンレイスに対する反応を、
(self == ムーンレイス) ifTrue: [ ^ '人それぞれ' ]
と付けてみましたら『MessageNotUnderstood: 瞳の色は?』とエラーが出ました。(ムーンレイスをnewしてません)
一方、(newしてない地球人の)ソシエでやると、
『Unkown variable:ソシエ』とメニューが出ます。
ソシエはUnkownですが、ムーンレイス自体はUnkownではない(オブジェクトとしてSqueakが知っている)ので『瞳の色は?』という刺激は知らないというエラーを返したのでは?
もしかしたら、そもそもオブジェクト"ムーンレイス"は変数を介さないと反応を返せないのですか?--さ茂 - 2002-06-07, 18:18:39
- ここはすごく面白いところです。よく気が付かれましたね。私も書きたいのですが、堪えてsumimさんの登場を待ちましょう。まさにraceの問題です。--abee - 2002-06-07, 18:30:03
遅くなりました(^_^;)。ARMS 読みながら、カレー喰っている場合じゃなかったですね(笑)。では、ムーンレイスをグローバル変数に入れて、試してみてください。「変数 _ ムーンレイス」「変数 髪の色は?」。ダメですよね。--sumim
つまり、オブジェクト「ムーンレイス」と“ムーンレイスたち”は本質的に別のものなのです。でもムーンレイスたちは、ムーンレイスに記載された方法に従って刺激に対応する…、と。--sumim - 2002-06-07, 19:04:50
だから、無関係ではなさそうですね…。--sumim - 2002-06-07, 19:06:08
ARMSもカレーも好きです(^-^)。
入れて試してみました。『ムーンレイス _ ムーンレイス new』
そうするとちゃんと'人それぞれ'と表示されました。
グローバル変数のムーンレイスとオブジェクト(サブクラス)のムーンレイスは別々に認識されてます。
これも↑「本質的に別」だから可能なのですね?--さ茂 - 2002-06-07, 19:17:50
では、ARMS に絡めて(笑)、「キース _ ムーンレイス new」としてみてください。--sumim - 2002-06-07, 19:21:08
おや? --sumim - 2002-06-07, 19:21:45
今度は「MessageNotUnderstood: new」になりませんか? 悪者と善良なパン屋さんを同一視したから…ではなさそうですね。--sumim - 2002-06-07, 19:24:29
実は、先の「ムーンレイス _ ムーンレイス new」で「ムーンレイス」はオブジェクト「ムーンレイス」ではなくなってしまったのです。--sumim - 2002-06-07, 19:25:29
(! --abee) - 2002-06-07, 19:25:49
とりあえずこのままでは不安なので、「ムーンレイス _ ディアナ class」として元に戻してあげましょう。--sumim - 2002-06-07, 19:26:49
で、「キース _ ムーンレイス new」できちんと反応が返ることを確認したら、イメージを保存せずに終了し、再起動したほうが無難だと思います。--sumim - 2002-06-07, 19:35:03
googleでSqueak予習(?)などしておりましたら、ザウチューのサイトに引っ掛かりまして……(^-^;)。
で、教室に戻ってみたら、むむむ。大変なことに……(^-^;)。
>「ムーンレイス _ ディアナ class」
ではなくて、「ムーンレイス _ ムーンレイス class」とやったら(あてずっぽう)直ったようです?
キースもハリーも追加できました。でも言われた通りに保存しないで再起動しました。
さてどうしましょう?--さ茂 - 2002-06-07, 20:26:06
サブクラスと同名の変数は作っちゃいけないということですよね? これは凄く怖いのでは?<知らずに踏んでたらどうしよう(^-^;)--さ茂 - 2002-06-07, 20:28:22
(! --abee) - 2002-06-07, 23:23:49
サブクラス(正式にはクラスのみで大丈夫です)も実はグローバル変数を使って参照しているのです。--sumim - 2002-06-07, 20:45:50
なので別のものを代入すると、とんでもないことになります。今回は、システムの動作に関係ないクラス「ムーンレイス」だったので別段、不都合はなかったように思われます。--sumim - 2002-06-07, 20:46:54
さて、クラスという言葉が出てしまったので、先の答えを申し上げますと「ムーンレイス」はクラス、それに new という刺激を与えたとき飛び出してきた“ムーンレイスたち”はインスタンスと言い別の種類のオブジェクトになります。クラスは、○○とはどうあるべきかを定めるために存在するオブジェクトで、それ自体はひとつしかなく、後ろでデーンと構えているだけです。インスタンスはいわば実働部隊、働きバチで、自分を生み出したクラスに定められた仕組みで動きます。--sumim - 2002-06-07, 20:49:49
なので「瞳の色は?」という刺激に対する反応は、オブジェクト「ムーンレイス」に登録されたものですが、それはロランなどのムーンレイスのインスタンス、すなわち“ムーンレイスたち”に対してどうあるべきかを記述したものだったので、オブジェクト「ムーンレイス」自身は「瞳の色は?」に対して反応できなかったわけです。--sumim - 2002-06-07, 20:53:51
ムーンレイス(クラス)のロランたち(インスタンス)だというのは理解できました。
現段階のクラスの『○○とはどうあるべき』は「瞳の色は?」だけと考えて良いですよね?
ムーンレイスのインスタンスになったら最後、「瞳の色は?」と聞かれればそこに書かれている答えを返す以外の仕事は(現段階では)無いのですよね?--さ茂
- 2002-06-07, 21:11:04
そうです。クラスとインスタンスの関係、それとグローバル変数との絡みかたを理解していただければ、これまでの疑問は解けるのではないかと思いますがいかがでしょうか? --sumim - 2002-06-07, 21:12:42
書き込みがクロスしました(^-^;)。わかりました。
で、疑問が一つ。
クラスと呼ぶ場合とオブジェクトと呼ぶ場合、これはどう分けて考えれば良い(あるいは考えなくて良い)ですか?--さ茂 - 2002-06-07, 21:14:12
Squeak/Smalltalk ではすべてのものがオブジェクトで、すべてのオブジェクトはインスタンスです。クラスもオブジェクトで別のクラスのインスタンスでもあります。なので new などという刺激に反応することができます。--sumim - 2002-06-07, 21:18:46
うー(^-^;)。
基本は全部オブジェクト。その「有り様」でインスタンスにもクラスにもなる、でよろしいですか?
ところでグローバル変数のロランたちを作ったわけですが、これらがいる場所(を探す)、消す方法はどんなでしょうか? クラスはブラウザで覗けて削除できる(危険!)のがわかったのですが?--さ茂 - 2002-06-07, 21:27:22
グローバル変数は Smalltalk というグローバル変数で管理されています。Smalltalk をタイプして inspect-it (コマンド + i ) するとロランたちに会えます。「Smalltalk removeKey: #ロラン」とすれば、ロランを(正確には、あるムーンレイスを参照するために作った「ロラン」という名前のグローバル変数を)消すことができます。--sumim - 2002-06-07, 21:32:54
>その「有り様」でインスタンスにもクラスにもなる
クラスは…と但し書きが付けばよろしいかと。たとえばロランやディアナが参照しているインスタンスは、どうあってもクラスにはなれませんので。--sumim - 2002-06-07, 21:34:24
見えました(^-^)。
でもけっこう一杯ありますね。グローバル変数。
>インスタンスは、どうあってもクラスにはなれません
インスタンスはクラスが生んだオブジェクトでしたよね。
>クラスもオブジェクトで別のクラスのインスタンスでもあります
……そう考えるとこれがわからなくなります?--さ茂 - 2002-06-07, 21:57:06
そうですね。ここいらへんが Smalltalk のちょっとやっかいなところで、解説書ではかなりのページを割いて説明しています。--sumim - 2002-06-07, 22:03:38
で、最初にプロトタイプベースの Self も関係ありそでなさそで…とごにょごにょと申し上げたののひとつは、こうした複雑な仕組みを排してシンプルに徹したのが Self だからという背景があるからなのです。Self ではクラスという概念がありません。オブジェクトはみなフレームと言います。--sumim - 2002-06-07, 22:05:46
ロラン(をまだ削除していなければ)のクラスは、「ロラン class」で知ることができます。もちろんそれは「ムーンレイス」です。ではムーンレイスのクラスは、つまり、ムーンレイスがインスタンスとして、そのクラスは誰? ということになりますが、それも「ムーンレイス class」とすることで調べられます。--sumim - 2002-06-07, 22:08:15
ここで表示されるのは「ムーンレイス class」です。実は、グローバル変数で参照できるのはクラスだけで、そのクラスやインスタンスはきちんと変数をつくってやっておかないと、参照できないのです。それで、例ではロランやディアナといったグローバル変数を作りました。で、ムーンレイスのクラスは便宜的に「ムーンレイス class」と呼びます。--sumim - 2002-06-07, 22:10:26
ではこの「ムーンレイス class」のクラスは…というと「ムーンレイス class class」とすると知ることができます。--sumim - 2002-06-07, 22:11:02
一般に、クラスのクラスのことを“メタクラス”と言います。すべてのメタクラスは、Metaclass のインスタンスです。--sumim - 2002-06-07, 22:13:35
Metaclass は Metaclass class のインスタンスなのですが、Metaclass class は Metaclass のインスタンスで、ここでループになっています。まあ、ここいらへんは「すべてのオブジェクトはインスタンスで、その生みの親であるクラスが存在する」ということで済ませておいてよいと思います。--sumim - 2002-06-07, 22:16:51
ここまでで疑問な点はありますか? よろしければムーンレイスに戻りましょう。--sumim - 2002-06-07, 22:25:33
はいそうします(T-T)。
そろそろお風呂に入って休みますm(_ _)m。あぁ最後の最後にクラクラclass……(^-^;)。
あ、ということはローカル変数が参照する(できる)のはクラスでなく何なのでしょうか? --さ茂 - 2002-06-07, 22:28:05
またクロスm(_ _)m。
「はいそうします」は、↑『「……クラスが存在する」ということで済ませておいてよいと思います。』に対してのはいです(^-^;)。--さ茂 - 2002-06-07, 22:30:28
どうぞ、お風呂に入ってクラスクラスしてください(^_^;)。--sumim - 2002-06-07, 22:30:36
じゃあ、今夜はここいらへんで。--sumim - 2002-06-07, 22:31:30
*ローカル変数が参照する(できる)のはクラスでなく何なのでしょうか?
変数はローカル、グローバルの別なくあらゆるオブジェクトと関連づけ(特定のオブジェクトを割り当ててそれの参照に使うことが)できます。--sumim
ちょっと遡ったところのこのご質問、
>変数というのは、オブジェクトと違ってブラウザ上ではあくまでムーンレイスとしてしか見えない
は解決していますか? 変数というのは私たちがムーンレイスたちとコミュニケーションをとるために便宜的に付けた名前で、我々が「ロラン」として相対することができるムーンレイスも、「ディアナ」として相対しているムーンレイスも、Squeak にとっては、(別人ではありますが)所詮「あるムーンレイス」、つまり、ムーンレイスのインスタンスに過ぎません。さらに、今のムーンレイスの定義では、インスタンスそれぞれに個性がありません。「瞳の色は?」という問いに答えることはでき、それぞれ個性があるように振る舞っていますが、その実は、ムーンレイスがあんたは今、ロランというグローバル変数で参照されているから緑ね、あんたはディアナだから青ね…といちいち指示を出しているに過ぎません。しかし本当は、インスタンスは個性を持つことが許されています。
まず、各人に個性がないことを確認するために、ロランかディアナを選択して inspect-it (コマンド + i ) してみてください。それ自身を示す self とこれから追加する個性を入れる場所の一覧を表示するための all inst vars の項目があるだけでそれ以外は、まっさらだとだけ見ておきます。あと、これだけの情報(Squeak 内部でのこのムーンレイスに関して知ることのできる情報)では、それがロランであるかディアナであるかは判別できないことも確認できるはずです。
では、個性を追加します。具体的にはインスタンス変数というのを用意します。
ムーンレイスで browser が開いていればそのままムーンレイスを何度かクリックして選択状態に、閉じてしまっていたら、再びムーンレイスか、ロラン、ディアナを選択して browse-it して browser を開いてください。すると、下の枠には、
Object subclass: #'ムーンレイス'
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'ターンA-ガンダム'
と出るはずです。そこで、instanceVariableNames: に添えられた '' の中に「名前」と入れて accept してください。さて、先ほどの inspector の中はどうなったでしょうか? --sumim - 2002-06-07, 23:03:32
「名前」という項目が追加されるはずです。inspector でこの「名前」をクリックすると、nil を参照していることが分かります。では、ロランの inspector なら nil を消して、'ロラン・セアック'と、ディアナの inspector なら 'ディアナ・ソレル' と入力して accept してください。これでグローバル変数の「ロラン」が参照する「ムーンレイス」のインスタンスが 'ロラン・セアック' という名前(インスタンス変数)として個性を持つことができました。--sumim - 2002-06-07, 23:19:41
ディアナも同様です。したがって「キエル _ ディアナ」として、キエルのふりをしても、「キエル」を inspect-it して名前のところを見れば、すぐに見分けが付きます。
さて、ここで、あらためて「瞳の色は?」の定義に戻ります。これを、
瞳の色は?
"瞳の色を答える"
名前 = 'ロラン・セアック' ifTrue: [ ^ '緑' ].
名前 = 'ディアナ・ソレル' ifTrue: [ ^ '青' ].
名前 = 'テテス・ハレ' ifTrue: [ ^ '赤' ].
^ '黒'
と書き換えるかコピペして accept してください。 見た目には同じ反応を示しますが、ムーンレイスは新たに与えられたインスタンスの個性を利用して、メッセージを受けたインスタンスにしかるべき反応をするように指示をだします。--sumim - 2002-06-07, 23:43:07
「名前」を持てるなら「瞳の色」も持てるのでは? そうです。いっそ「瞳の色」というインスタンス変数を設けて、そこに色を入れておけば、もっとプログラムはシンプルになるはずです。「名前」にならって「瞳の色」というインスタンス変数を追加してみてください。「名前」の後に半角スペースを入れるのを忘れないようにしてください。
Object subclass: #'ムーンレイス'
instanceVariableNames: '名前 瞳の色 '
classVariableNames: ''
poolDictionaries: ''
category: 'ターンA-ガンダム'
これを accept すると、inspector の「名前」の下に「瞳の色」が追加されます。さらに、これをクリックして 'ロラン・セアック' なら '緑'、'ディアナ・ソレル' なら '青'、'テテス・ハレ' なら '赤' と入力(コピペ)して accept します。「瞳の色?」のほうは、
瞳の色は?
"瞳の色を答える"
^ 瞳の色
と変えればよいでしょう。--sumim - 2002-06-07, 23:56:43
おはようございます!
できましたできました! 俄然プログラム然としてきました!
同じように髪の色も作れることは理解できます。
が、例えば「ロラン ディアナと会う '緊張する'」「テテス ディアナと会う '殺意を持つ'」というインスタンス間の反応(人間関係)というのは「瞳の色は?」的に記述できるでしょうか?
あてずっぽうに考えて、刺激の中に対象インスタンスの指定が入るはずなんですが、もぅこうなったら想像力が働かなくて(^-^;)。
あるいは
ロラン + ディアナ '緊張する'
テテス + ディアナ '殺意'
ロラン + テテス 'どきどき'
さらにロラン + キエル(ディアナのインスタンス) 'ときめき'
みたいな刺激の受け取り方もありでしょうか?
(+、-、=は算術以外で使えないでょうけど)--さ茂(ちょっと出かけますので夜まで反応なくなります。よしなにm(_ _)m)
- 2002-06-08, 08:26:44
>ロラン + ディアナ '緊張する'
>テテス + ディアナ '殺意'
>ロラン + テテス 'どきどき'
>さらにロラン + キエル(実はディアナ) 'ときめき'
おはようございます。これ、面白そうなので(最後のはまだ地球人を定義していないため後回しにしますが、それ以外を)やってみましょう。まず「好意対象」と「憎悪対象」というそれぞれの感情の相手を指し示すためのインスタンス変数を作ります。
Object subclass: #'ムーンレイス'
instanceVariableNames: '名前 瞳の色 好意対象 憎悪対象'
classVariableNames: ''
poolDictionaries: ''
category: 'ターンA-ガンダム'
次に刺激(メッセージ)「+」を定義します。+ は必ず“あるムーンレイス”を伴います。
+ あるムーンレイス
"あるムーンレイスを目の前にしたときの心情を返す"
(好意対象 = あるムーンレイス) ifTrue: [^ 'どきどき'].
(憎悪対象 = あるムーンレイス) ifTrue: [^ '殺意!'].
^ '別になんとも'
さて、あとはロランを inspect-it して、好意対象のところに「ディアナ」(グローバル変数の、です。ここでは'ディアナ・ソレル'という文字列でないことに注意してください)を入れて accept、直後に「a ムーンレイス」になることを確認します。ちなみにこの「a ムーンレイス」が誰なのかを後から知りたいときは、好意対象の欄をダブルクリックすることで新しい inspector を開き、そこで(名前や all inst vars などで)見ることができます。準備が整ったら「ロラン + ディアナ」を print-it すると 'どきどき' と返ってくるはずです。--sumim - 2002-06-08, 12:25:41
移動しましょう。
このページを編集 (28527 bytes)
|
以下の 3 ページから参照されています。 |
This page has been visited 12237 times.