ロランとディアナ4
ここからの続き…
お昼休みにやってみました。
『| str sels |』
これは凄いですね! <上のやつはバグりました
応用できそうなので覚えておきます。
(これを加工すれば任意のテキストの全文検索機能も作れますよね?)
で、file-outして変更してfile-inしました。……が、後はまた帰宅してからm(_ _)m。--さ茂 - 2002-06-14, 12:40:39
>これは凄いですね!
偉大なオブジェクトたち(とその設計者)のなせる技です。彼らにお願いしてちょいちょいとしかるべき刺激を与えるだけで、こんなことができてしまう…という例としてもよろしいかと。--sumim
>これを加工すれば任意のテキストの全文検索機能も作れますよね?
“加工すれば”と言い切ろうとすると程度問題がつきまとうので、現時点では“応用して作り込めば”というふうに思っていていただいた方が問いに答える側としては罪が少ないと思います。が、理論的には同じ方法論で似たようなツールを作ることは可能です。アイデアや夢は持っておいてください。最終目標に掲げた執筆環境構築に目を向けた場合、Squeak/Smalltalk には(Dynabook の利用形態においてプログラミングを「流ちょうな読み書き」の要素として位置づけているだけあって)プログラミング用に用意されていても執筆に応用できそうなツールやしくみがたくさんあります。これらについては機会を見つけて適宜、紹介したいと思います。--sumim - 2002-06-14, 14:07:07
>執筆に応用できそうなツールやしくみがたくさんあります。
夢が膨らみますね(^-^)。
ところで、今夜は姪が泊まりに来て……(子守担当なもんで(^-^;))ちょっとレスがおろそかになると思います。よしなにm(_ _)m。--さ茂 - 2002-06-14, 17:45:39
どうぞ、姪御さんとあそんであげてください。私もちょっと一休みです(笑)。--sumim - 2002-06-14, 22:44:03
さ茂さんのところと、私のところで環境を揃えたいので、上で修正を加えて file-in していただいたのと同じ 人間.st を ningen.st とファイル名を変えて、このページにアップロードしておいていただけますか? --sumim - 2002-06-15, 17:26:06
ningen.st
便利ですねswikis(^-^)。こんなんでどうでしょう?
>私もちょっと一休みです(笑)
連日連夜のご教示、何とお礼をいっていいものかm(_ _)m。--さ茂 - 2002-06-15, 18:44:48
いえいえ。根が短気なもので、失礼なことをいろいろ申し上げて恐縮しております。また、私は自分が楽をするためならどんな労も苦にならない…という一見矛盾する奇妙な性向を持っておりますので、どうぞお気になさらずに(笑)。むしろ調子に乗ると無茶苦茶なペースで進むキライがあるので、さ茂さんのペースを大事にしてください。--sumim - 2002-06-15, 19:02:07
ningen-new.cs
チェックしましたが、定義されていない刺激やバージョンが古いものがあったので、若干の追加や変更も含めた差分ファイル(.cs) をアップロードしておきましたのでこれを file-in して save していただけますか?--sumim - 2002-06-15, 19:15:39
具体的な変更事項は、
- “?”付き刺激の名称変更。「瞳の色は?」→「の瞳の色」、「名前は?」→「の名前」
- 瞳の色を尋ねる刺激のコードがグローバル変数依存の古い物だったので修正
- インスタンス変数「性別」を追加。
- 上に伴い「の:瞳の色は:」を「の:瞳の色は:で:」に変更
です。--sumim - 2002-06-15, 19:19:04
file-inしました。
>むしろ調子に乗ると無茶苦茶なペースで進むキライがあるので、
お手柔らかに(^-^;)。--さ茂 - 2002-06-15, 19:20:22
気を付けます(笑)。さて、先を進めましょう。これで無事「ムーンレイス」と「地球人」の共通項をまとめた「人間」ができましたので、このサブクラスとして「ムーンレイス」と「地球人」を定義しましょう。まず「ムーンレイス」だけ定義して、期待通りの反応を示してくれるかどうかをチェックします。browser のクラス枠の「人間」を何度かクリックして選択を解除すると、下の枠(コード枠と呼びます)に、
Object subclass: #NameOfSubclass
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'ターンA-ガンダム'
と表示されますので、Object を「人間」、#NameOfSubclass を「#ムーンレイス」に書き換えて accept します。これで「人間」のサブクラス「ムーンレイス」が無事定義されました。--sumim - 2002-06-15, 19:29:19
作りました。--さ茂 - 2002-06-15, 19:33:00
ロラン _ ムーンレイス new の: 'ロラン・セアック' 瞳の色は: '緑' で: '男'.
ディアナ _ ムーンレイス new の: 'ディアナ・ソレル' 瞳の色は: '青' で: '女'.
テテス _ ムーンレイス new の: 'テテス・ハレ' 瞳の色は: '赤' で: '女'.
ロラン が好きなのは: ディアナ.
テテス が嫌いなのは: ディアナ
これを選択して do-it すると、基本的な人物設定が終わります。--sumim - 2002-06-15, 19:34:47
設定しました。--さ茂 - 2002-06-15, 19:37:49
そこで、ロランを inpect-it してみてください。作っていないはずのインスタンス変数(名札)がちゃんと用意されているはずです。また(すでに「ロラン」などグローバル変数の定義の際に使っているのでナンセンスですが)「ムーンレイス」には定義していない刺激にも対応できます。--sumim - 2002-06-15, 19:36:35
ここまでよろしいでしょうか?--sumim - 2002-06-15, 19:45:02
OKです。
前と違ってロランの好印象にディアナの名前を見つけられません。(もちろん刺激には正しく反応します)
a ムーンレイス をinspect-itするとムーンレイスclassが表示されます。ここも大きな違いですね。--さ茂 - 2002-06-15, 19:51:11
>前と違ってロランの好印象にディアナの名前を見つけられません
「好印象」→「好意対象」ですよね? これには「a ムーンレイス」が表示されるはずです。好意対象をダブルクリックすると、ここでの「a ムーンレイス」とは何かを inspect することができます。その「名前」は 'ディアナ・ソレル' のはずですが、状況のご理解のほう、大丈夫ですよね?--sumim
>a ムーンレイス をinspect-itするとムーンレイスclassが表示
これは「a ムーンレイス」の「ムーンレイス」のところだけが選択されて、クラス「ムーンレイス」の inspect-it と解釈されているからだと思います。ちなみに「a ムーンレイス」は“あるムーンレイス”、つまり「ムーンレイス」のインスタンスを端的に表現した文字列なので inspect-it しても目指すあるムーンレイス”には行き着けません。注意してください。--sumim - 2002-06-15, 20:11:40
>その「名前」は 'ディアナ・ソレル' のはずですが、状況のご理解のほう、大丈夫ですよね?
おっと失礼しました。出ました。出ました。--さ茂 - 2002-06-15, 20:18:12
イングランド戦か『アルマゲドン』は大丈夫ですか? 遠慮なくおっしゃってください(笑)。適当に先を書いておきますので。--sumim - 2002-06-15, 20:27:04
「ムーンレイス」は「人間」のサブクラスとして位置づけられたので、「人間」の設計・仕様をそのまま引き継いでいます。クラスとインスタンスの関係が「設計図・仕様書」と「それに従って作られた物」なら、スーパークラスとサブクラスの関係は「師匠」と「弟子」といったところでしょうか。ここでいう弟子は非常に優秀で、生まれながらに師匠の持っているワザを余すところなく継承しています。さらに弟子は必要なら独自のワザ(刺激への対応)を持ったり、師匠のそれを自分の都合のよいように置き換えたりもできます。--sumim - 2002-06-15, 20:59:13
改めて「人間」の定義を見てみます。「ムーンレイス」のときに「人間」と置き換えたところには「Object」と書かれているいますね。つまり「ムーンレイス」が「人間」のサブクラスであるのと同様に、実は「人間」は Object というクラスのサブクラスなのです。なので「ロラン = ディアナ」(ロランの参照する“あるムーンレイス”はディアナの参照する“あるムーンレイス”と同じものか? 同じなら true を、違うなら false を反応として返す)のように、定義していないはずの「=」という刺激にも反応できます。--sumim - 2002-06-15, 21:09:34
実際に、Object に = が定義されているのは、= を選択して browse-it して「Object = {comparing}」をリスト枠でクリックし、再び browse-it することで表示される browser で確認できます。--sumim - 2002-06-15, 21:14:10
同じ Object に printOn: という刺激が定義されているのを見つけることができると思います。実はこれが inspector や print-it で“あるムーンレイス”を便宜的に表わすのに「a ムーンレイス」という適当な名前を生成している張本人です。この刺激を「人間」に持たせて、分かりにくい「a ムーンレイス」ではなく「ムーンレイス の: 'ロラン・セアック'」などと一目でわかるような表記にしてみましょう。「人間」を browse-it して、as yet unclassified をクリック、テンプレートを削除して、
printOn: あるStream
"あるStreamに刺激を受けたある人間を端的に表わす文字列を追加する"
あるStream nextPutAll: self class name, ' の: ''', 名前 asString, ''''
を accept します。これで inpector で「a ムーンレイス」と表示されずに、誰だかすぐに分かるはずです。--sumim - 2002-06-15, 21:24:28
ちょっとややこしいことをしたので、いったん、ここでやめておきます。--sumim - 2002-06-15, 21:25:34
>イングランド戦か『アルマゲドン』は大丈夫ですか?
おっと失敬。イングランド戦を横目にチャンドラのセットアップに時間食っちゃいましたm(_ _)m。
誰だかわかるようになりました。
ちょっとややこしい……というより、まさにオブジェクトの海を痛感しております。
溺れそうですが、藁をも掴もうとするといろいろなオブジェクトが指に引っ掛かるという感じです。
『=』をbrowse-itする、この点だけで感動です。
今まで単なる記号、文字一字でしかなかった「=」が、生命を持っているのがわかります。
ちなみに『+』をbrowse-itしてclass人間を見つけて喜んだりしました(^-^;)。
それで、printOn:表示しろってことなのでしょうが、ややこしいついでにお教え下さい。
Stream、nextPutAllの部分。
本来は、「a ムーンレイス」と表示するところを、「それ自身のclass名」+「の:」+「名前」として表示しろ、という刺激と読み取ったのですが、無数の''''が難解です。
同時に表示するテキストの『'の:'』までは理解できたのですが、以後は?
『あるStream nextPutAll: self class name, 'の',名前 asString』
で試してみました。
答えは、ムーンレイスのディアナ・ソレル
これでは問題があるのですね?
あぁ! そうか。名前を''で囲むためですね?
ムーンレイス の: 'ディアナ・ソレル'
あと、それでも余計に見える''は、見た目のために余白を付けてる? このあたりの気遣いがわたしにとってはまだ難解であるわけです(^-^;)--さ茂 - 2002-06-15, 22:38:59
>無数の''''が難解
文字列は ' ' で括るという話は以前しましたね。で、この ' ' の中で「'」を表現するためにどうするかというと、「''」のように2コ繰り返すのです。なので、' ' のなかでは '' のような ' の連続はひとつの「'」に置き換えて解釈してください。同じことがコメントのダブルクオーテーション「"」についても言えます。なお ' ' 中のダブルクオーテーション、" " 中のシングルクオーテーションはそれぞれ、そのまま記載しても問題ありません。--sumim - 2002-06-15, 22:52:16
>見た目のために余白を付けてる? このあたりの気遣いがわたしにとってはまだ難解
もっともです。ただわかりよくするためなら、直接「ディアナ・ソレル」とでも表示するよう指示すればよいわけです。なぜ「ムーンレイス の: 'ディアナ・ソレル'」としたかというと、このあと「の:」という刺激を「人間 class」に登録して、グローバル変数なしにこの“ディアナ・ソレルという名前を持ったあるムーンレイス”を直接、参照できるようにしたいと思ったからです。--sumim - 2002-06-15, 22:55:33
の: ある名前
"ある名前のある人間を返す"
| 候補 |
候補 _ self allInstances select: [ :ある人間 | ある人間 の名前 = ある名前 ].
^ (候補 size > 0) ifTrue: [ 候補 first ] ifFalse: [ nil ]
これを「人間 class」に登録してください。--sumim - 2002-06-15, 23:00:58
>『=』をbrowse-itする、この点だけで感動です。
あっちゃ〜…。失敗してしまいました。気を付けていたのですが、つい…。= は刺激なので、browse-it ではなくて、implimentors of it(コマンド + m ) と書くべきでした。実をいうと、刺激名を browse-it すると自動的に implimentors of it してくれるのでどちらでもいいのですが…。--sumim - 2002-06-15, 23:16:42
>まさにオブジェクトの海を痛感
最近は私自身は「どーせ、みんなオブジェクトなんだから…」と麻痺していちいち驚かなくなってしまいましたが、昔は「あんたもオブジェクトか!? もしやあんたも…! が〜ん。こっ、ここまでぇえぇえ、やるかぁ? ふつうっ」などというのを繰り返していましたので、お気持ちがよく分かります。--sumim - 2002-06-15, 23:26:59
さて。名札以外の方法で“あるムーンレイス”を呼び出すことができるようになりましたので、この機能を利用して、ちょっと寄り道して、オブジェクトの寿命を調べてみましょう。刺激を与えると、その反応にそれ自身か別のオブジェクトが返されることはすでにお話ししましたが、このとき既存のオブジェクトに限らず、新しいオブジェクトが作られて返されることもあります。刺激は私たちが直接与えるものだけでなく、オブジェクト同士が与えあっているものもあるので、その都度、連鎖反応的に新しいオブジェクトが生まれているわけです。そのほとんどが、使い捨てのものでしょう。こうした役目を終えたオブジェクトたちが世界に溢れてしまわないように、システムにはこれを監視して無用なオブジェクトは排除する、つまり殺してしまう仕組みが用意されています。ただ、要不要の厳密な判断は難しいので、名札やそれに準ずるものにつながれているかそうでないかで単純に判断する、という決まりになっています。--sumim - 2002-06-16, 16:56:23
つまり、どこにもつながっていないオブジェクトは我々が必要だと思っていても、システムはそれを無用と判断して殺してしまうのです。逆に不要なオブジェクトをどこかに繋げて忘れてしまっていると、いつまでも殺されず残っているので余計なメモリを消費し続けることになります。後者は、仕組みを知らずに一見不要だからといって、やたら削除するのはよくない…という理由の一つでもあります。--sumim - 2002-06-16, 17:05:30
捨てキャラ _ ムーンレイス new の: '兵士1' 瞳の色は: '黒' で: '男'
で、'兵士1' を作ります。これは「ムーンレイス の: '兵士1'」でも「捨てキャラ」でも同じオブジェクトを参照できます。その証拠に、
捨てキャラ = (ムーンレイス の: '兵士1')
の print-it は true を返すと思います。--sumim - 2002-06-16, 17:11:06
'兵士1' は、今は「捨てキャラ」という名札につながっていることで生きながらえています。この命綱を断ち切ると、死刑執行部隊に瞬殺されます。
捨てキャラ _ 3.
ムーンレイス の: '兵士1'
一行目で、名札「捨てキャラ」につながっているオブジェクトを '兵士1' でなく、3 という別のオブジェクトに変えます。必然的に、'兵士1' につながっている命綱は切れてなくなります。その後、二行目を実行しても nil つまり、そういう名前のムーンレイスは見つからない…という反応が返ってきます。--sumim - 2002-06-16, 17:16:18
'兵士' の生き残る道は、もうひとつあります。
テテス が好きなのは: (ムーンレイス new の: '兵士2' 瞳の色は: '黒' で: '男')
'兵士2' は '兵士1' のときのようにグローバル変数にはつながっているわけではありませんが、'テテス・ハレ' の中にある「好意対象」という名札につながっています。これはセーフです。なので「テテス の好きな人」や「(ムーンレイス の: 'テテス・ハレ') の好きな人」、「ムーンレイス の: '兵士2'」の print-it は nil ではなく、「ムーンレイス の: '兵士2'」を常に返すはずです。--sumim
しかし、いったんテテスにフられると、つまり例えば「テテス が好きなのは: ロラン」を do-it して 'テテス・ハレ' の好意対象という札に別のオブジェクトをつなげると、'兵士2' も '兵士1' 同様、その唯一の命綱を失い、抹殺されます。以後、「ムーンレイス の: '兵士2'」の print-it は nil を返すことでその死を我々に伝えます。--sumim - 2002-06-16, 17:24:39
こんばんわ。長らくレスポンス無しですみませんでしたm(_ _)m。
明後日(あ、もう明日です)、地元に日本代表が来る(100年に一度無い歴史的大事件です!)というもので……ずっとチケット探しに奔走(ネット上)しておりました。……難しいですが(T-T)。
↑課題については、明日の昼休みにやってみますm(_ _)m。すみません。--さ茂 - 2002-06-17, 00:35:17
チケット、とれるといいですね。がんばってください。ムーンレイスたちのほうはお気になさらず一段落してからじっくりどうぞ。--sumim - 2002-06-17, 00:55:28
チケットは難しいです(T-T)。
さて、上の例題はOKです。
ただ一点、好意対象は一つしか持てないか? ということです。
(今更なんですが、前々から疑問に思ってました)
ロランはディアナもキエルも、テテスも好きなんです(^-^;)。
例えば、
ロラン が好きなのは:ディアナ テテス
ではエラーが出ます。--さ茂 - 2002-06-17, 12:59:59
>ロランはディアナもキエルも、テテスも好きなんです(^-^;)。
>肥大化を解消するのは大括りでこの課題が完成した後の、第二段階という感じですね? <応用編 --さ茂 - 2002-06-09, 23:06:57
>複雑な人間関係を管理するときに彼か、彼に似た性質を持つオブジェクトに再登場願うつもりでおります
前振りはしたつもりで、それ(人間関係に関する機能拡張はもうすこし後で…)はご了解いただいているつもりでおったのですが…(^_^;)。ちなみにご指摘の点ですが、名札の先、もしくは、刺激の「:」ひとつに付随させられるオブジェクトはかならず一つです。覚えておいてください。「ロラン が好きなのは:ディアナ テテス」とすると、ディアナに「テテス」とう刺激を与えてその反応で生じたオブジェクトを「が好きなのは:」刺激に付随させるという文法上の解釈になります。「テテス」などという刺激は当然定義されていないので、エラーになるわけです。繰り返しになりますが、複数のオブジェクトをぶら下げたいときは複数のオブジェクトを繋げることができる性質を持つひとつのオブジェクト(先の Array の仲間のインスタンス)を繋げたり付随させたりします。これは後でやりますのでご安心ください。--sumim - 2002-06-17, 15:46:27
abee さんが、日本語の一時変数を使ったときに“バグる”のを修正するためのパッチを作ってくださったので、file-in しておいてください。--sumim - 2002-06-17, 16:02:18 (さ茂さんへ… --abee)
abeeさん>
なにより、「バグった」を見ると私の心臓に悪いので:-)
しつれいしました。了解いたしました。気をつけますm(_ _)m。--さ茂
- いや、特に謝っていただくようなことではありませんので、豆知識程度にお考えください。--abee
とりあえず、人間の機能拡張の前に、スーパークラス、サブクラスのところ(地球人たちの定義)を終わらせておきませんか?--sumim
ちなみに(これ自体、寄り道ではありましたが)本題のオブジェクトのほうは寿命は大丈夫ですね? どこかにつながっていないオブジェクトは我々が必要と思っていても、不要と見なされてシステムに抹殺されます。注意してください。--sumim
もうひとつ人間に機能を追加しておきます(正確には 人間 class に定義するわけですが)。新しいムーンレイスを定義するときに「ムーンレイス new」とせずに直接「ムーンレイス の: 'だれだれ' 瞳の色は: '黒' で: '男'」などと new を入れずにクラス「ムーンレイス」に刺激「の:瞳の色は:で:」を送って同じことをするにはどうしたらよいでしょうか? 考えてみてください。--sumim
- 2002-06-17, 16:36:52
答えは簡単ですね。「人間 class」に「の:瞳の色は:で:」を再び定義すればよいわけです。ただし、刺激への応答内容は次のように変わります。
の: ある名前 瞳の色は: ある色 で: 男か女
"基本的な状態を設定した「ある人間」を返す"
^ self new の: ある名前 瞳の色は: ある色 で: 男か女
くれぐれも「人間」ではなく「人間 class」に定義することをお間違えのないように。--sumim - 2002-06-17, 16:43:41
これでいちいち new を付けて「ムーンレイス new の: '兵士' 瞳の色は: '黒' で: '男'」とせずに new を省いて「ムーンレイス の: '兵士' 瞳の色は: '黒' で: '男'」とでき、読みやすくなりますね。--sumim - 2002-06-17, 16:46:32
では本題にもどって、地球人の定義に進みましょう。例によって browser のクラス枠をクリックしてテンプレートを呼び出し、Object を 人間、#NameOfSubclass を #地球人 に書き換えて accept します。
キエル _ 地球人 の: 'キエル・ハイム' 瞳の色は: '青' で: '女'.
ソシエ _ 地球人 の: 'ソシエ・ハイム' 瞳の色は: '茶' で: '女'.
グエン _ 地球人 の: 'グエン・サード・ラインフォード' 瞳の色は: '青' で: '男'.
グエン が好きなのは: ロラン
地球人たちの定義はこんなかんじ(↑)でどうでしょう。--sumim - 2002-06-17, 16:48:34
ここまでできたら課題です。「はストレート」という刺激を与えたとき、true か false という反応を人間に追加するにはどこにどのようなコードを登録すればよいでしょうか(グエンも出てきたことですし“ストレート”が何かの説明はいりませんよね?(^_^;))。これまでの応用でコードを書き上げることは不可能ではありませんが、できなくてもいっこうに構いません。そのときは、考え方の方針だけ教えてください。--sumim - 2002-06-17, 16:56:40
ギブアップでしたら、まず、「はストレート」という刺激にいつも true と返すコードを登録する場所とそのコードをどうしたらよいか…というふうに課題をシンプルに変換して取り組んでみてください。--sumim - 2002-06-17, 16:58:39
「はストレート」は……「はノンケ」のことですか(^-^;)?
ええと……。
selfの好意印象が、seifと同性ならfalseかな(^-^;)?
>前振りはしたつもりで、それ(人間関係に関する機能拡張はもうすこし後で…)はご了解いただいているつもりでおったのですが…(^_^;)。
ええ(^-^;)。そろそろかなぁと思ったものですから……。
(あと、ロランと実は同格の女性・ローラも設定したいです。正確にはグエンはローラが好きなんです)--さ茂 - 2002-06-17, 19:30:52
コードの書き方はもう少し考えてみます、が、↑そもそも間違ってると無駄な手間ですね(^-^;)。
ところで、チケットはあきらめました(T-T)。--さ茂。 - 2002-06-17, 19:36:14
>selfの好意印象が、seifと同性ならfalseかな(^-^;)?
オッケーです。これを Smalltalk 語(「オブジェクト 刺激」という文法)に書き下ろすとどんなふうになるでしょう? あと、それはどこに定義すればよいでしょうか。--sumim - 2002-06-17, 19:37:55
>そろそろかなぁと思った
そろそろですが、一段落するところまで待ってください。--sumim - 2002-06-17, 19:39:39
うーん。いろいろ頭をひねっているんですが……(^-^;)。
で、またチケット1000枚追加の情報が流れて、ネットワークをWindows機(Macだとアクセスしてもスクリプトが走らないんです)に占領されることになってしまいました(^-^;)。すみません。一旦撤退(?)しますm(_ _)m。--さ茂 - 2002-06-17, 20:13:06
すみません。復帰しましたm(_ _)m。<断念
家内と交代でアクセスし続け更新し続けましたが、接続すら出来ず……(T-T)。
家内と交代した時にMacに戻っていろいろやってみましたが、どうにも応用できません(T-T)。
まず、「ある人間」に好意対象を吐き出させ、その性別を判断、その性別と自分の性別を比較、一致すればfalse、そうでなければture。
こういう複雑な流れでよろしいのでしょうか?
性別などの名札を使う場合、classの刺激では駄目でした。classの中には変数が設定されてないからですよね?
そもそも「好意印象の性別」の呼び出し方がわかりません。
前は「好きな人は」で「a ムーンレイス」の名札の一つ「ディアナ」が出てきましたが、今は「ムーンレイス の: 'ディアナ・ソレル'」と出てきます。
その性別を呼ぶためには、'名前'ではなく変数ディアナ(など)に対する別の刺激で「^性別」を人間のインスタンスに追加するしか考えつきません。
さらに最初の変数(ロランとか)の性別を出して、それを比較する。
これを一個の刺激にまとめるとなると……もう想像力・応用力の無さを痛感します(T-T)。
if条件式とか、きっとローカル変数とかを使わなければ駄目だと思うのですが、やはり手も足も出ません。とほほ。--さ茂 - 2002-06-17, 23:20:48
>「^性別」を人間のインスタンスに追加する
失礼しました。性別のインスタンス変数を追加したときに刺激を加えるのをすっかりわすれていました。おっしゃるとおりです。好意対象の性別を知るには、
の性別
^ 性別
という刺激を人間に登録しておく必要があります。すみません。--sumim - 2002-06-17, 23:27:12
>まず、「ある人間」に好意対象を吐き出させ、その性別を判断、その性別と自分の性別を比較、一致すればfalse、そうでなければture。
設計図・仕様書の中では「好意対象」という名札が使えますから、「好意対象 の性別」でその性別をはき出させ、それを自分の「性別」という名札が参照している '男' か '女' と比較すれば良い、と。ほぼ正解です。--sumim - 2002-06-17, 23:30:38
比較には = という刺激を使います。伴わせたオブジェクトが刺激を受けたオブジェクトと等しければ true を、そうでなければ false をはき出します。例えば、「3 = 4」は false をはき出します。これでできますね。--sumim - 2002-06-17, 23:32:14
処理を中断して結果をはき出させるのには「^」を使います。以上、まとめてみてください。--sumim - 2002-06-17, 23:33:54
>前は「好きな人は」で「a ムーンレイス」の名札の一つ「ディアナ」が出てきました
いえ。これは勘違いだと思います。どんな場合にも名札が出てくることはありえません(オブジェクトは自分にどんな名札が付いているか知らないので…)。前は「a ムーンレイス」と便宜的に表示していたのを今は「ムーンレイス の: 'ディアナ・ソレル'」とより具体的に表示してくれているだけで両者は同じものです。--sumim - 2002-06-17, 23:37:37
>if条件式とか、きっとローカル変数とかを使わなければ駄目
今回は、刺激「=」を与えた結果、はき出されるもの(true か false)をそのまま返せばよいので if 条件式もテンポラリ変数も必要ありません。大丈夫です。--sumim - 2002-06-17, 23:39:51
こんな感じです(^-^;)。七転八倒しました。
はストレート
"同性が好きならFalse、そうでないならTrueを返す"
^性別 = (好意対象 の性別)
ifTrue: [^False]
ifFalse: [^True]
↑同性が好きだとTrueを返す刺激はすぐ出来たのですが(^-^;)。
どうでしょうか?
>これは勘違いだと思います。
失礼しました(^-^;)。うーん我ながらこういうのが多いですm(_ _)m。
では今夜はこのへんで。ありがとうございましたm(_ _)m。--さ茂 - 2002-06-18, 00:17:03
基本はよいと思います。ただ、はき出したいのは true か false で True か False ではないので、単純にこれ(↓)でオッケーです。
はストレート
"同性が好きならfalse、そうでないならtrueを返す"
^ 性別 = (好意対象 の性別)
チケットに刺激の設計に、お疲れさまでした。--sumim - 2002-06-18, 00:24:50
ちなみに True は true の、False は false の設計図・仕様書(つまりクラス)だというのは大丈夫ですよね? --sumim - 2002-06-18, 00:27:19
でも七転八倒の成果で、ついでに条件分岐も習得してしまわれましたね(^_^;)。今後、機会があったら活用してください。刺激「ifTrue:ifFalse:」は true もしくは false への刺激で、true への刺激の場合は ifTrue: の後の、false への刺激の場合は ifFalse: の後の [] 内のコードの結果をはき出させます。ちなみに [] もオブジェクトで、BlockContext という設計図・仕様書(クラス)を持っています。実際。「 [] class 」を print-it すると「BlockContext」と出ます。BlockContext (のインスタンス←省略しています)は自分の中にコードを持つためのオブジェクトで、value という刺激を受けて、そのコードを実行します。「 | あるブロック | あるブロック _ [ 3 + 4 ]. あるブロック value 」を print-it すると 7 がはき出されるというぐあいです。余談でした。--sumim - 2002-06-18, 00:50:23
おはようございます。
チケットはとれませんでしたが、開催地在住の姉のコネで、なんと! 会場内で応援用の小旗を配るボランティアをすることになりました。
……いや、わたしは仕事で、うちの家内たちだけが行くんです(^-^;)。つられて早起きしました。
>単純にこれ(↓)でオッケーです。
……うーん。「ストレート」という言葉、よくわかりません(^-^;)。
グエンはtrueでロランはfalseでいいんですね?
逆のような気がするのです。
>True は true の、False は false の設計図・仕様書(つまりクラス)だというのは大丈夫ですよね?
すっかり忘れていました(^-^;)。--さ茂 - 2002-06-18, 06:07:05
>逆のような気がするのです。
おっしゃるとおりでございます。(^_^;)。うっかりしておりました。
はストレート
"同性が好きならfalse、そうでないならtrueを返す"
^ (性別 = 好意対象 の性別) not
でした。not は true もしくは false への刺激で、true なら false を、false なら true をはき出させます。true が True に気をとられて「同性が好きだとTrueを返す刺激はすぐ出来たのですが(^-^;)。」の意味を見落としていました。ごめんなさい。そうすると、not の情報はあらかじめ与えられていなかったわけですから、さ茂さんの ifTrue:ifFalse: を使ったオリジナルの、
はストレート
"同性が好きならfalse、そうでないならtrueを返す"
^性別 = (好意対象 の性別)
ifTrue: [^ false]
ifFalse: [^ true]
が正解となります。失礼いたしました。ただ「^」は処理を中断して直後の式の結果を返す役割りを果たすので、性別の前の ^ か、true もしくは false の前の ^ は不要です。
はストレート
"同性が好きならfalse、そうでないならtrueを返す"
^性別 = (好意対象 の性別)
ifTrue: [false]
ifFalse: [true]
もしくは、
はストレート
"同性が好きならfalse、そうでないならtrueを返す"
性別 = (好意対象 の性別)
ifTrue: [^ false]
ifFalse: [^ true]
で、期待した反応をはき出してくれます。また「=」の変わりに「~=」という刺激を使うこともできます。「~=」は刺激を与えるオブジェクトと、刺激に伴わせるオブジェクトが同じでなければ true を、同じなら false をはき出させます。よかったら not と併せて覚えておいてください。
はストレート
"同性が好きならfalse、そうでないならtrueを返す"
^性別 ~= (好意対象 の性別)
「ストレート」は「ノンケ」の意味ですから、さ茂さんが正しいです(^_^;)。しかしグエンは女装のロランが好きだったのですね、私はてっきり…(笑)。--sumim - 2002-06-18, 10:21:38
いずれかを人間に登録しておしまいです。--sumim - 2002-06-18, 11:40:52
さて、もうひとつだけ課題にとりくんでください。特に指定しなければムーンレイスは「ムーンレイス の: 'ディアナ・ソレル'」を、地球人は「地球人 の: 'キエル・ハイム'」を生まれながらに好意対象にするようにしたいと思います(もちろん、課題のための設定で、実際とは異なります。あしからず)。このような性質をムーンレイスや地球人に持たせたいとき、どこになにを登録したらよいでしょうか。考えてみてください。--sumim - 2002-06-18, 11:46:58
あぁよかった(^-^)。<何が?
課題は今夜(家内のワールドカップ・フィーバーの余波にさらされなければ)考えてみます。
徐々に実践的になってきて……ちょっと頭がこんがらがってきました(^-^;)。
勘では、人間のインスタンスに入れないと「好意対象」とか使えないんですが、生まれた瞬間に……というところはどうもclassに登録しなきゃいけないような気が……。
の: ある名前 瞳の色は: ある色 で: 男か女
"基本的な状態を設定した「ある人間」を返す"
^ self new の: ある名前 瞳の色は: ある色 で: 男か女
を改造するというのが一番ありそうなのですが……。
>しかしグエンは女装のロランが好きだったのですね、私はてっきり…(笑)。
てっきり、は当たってます(^-^;)。TV版はうやむやになってますが、富野初期案でははっきりと……(^-^;)。小説もそれにならいました。
(あくまでローラ・ローラが対象なわけです(^-^))--さ茂 - 2002-06-18, 12:43:12
>「人間>>の:瞳の色は:で:」を改造するというのが一番ありそう
目の付け所は良いと思います。ここで self は何かを考えてみてください、というのが(ある解答を想定したときの)ヒントの一つです。--sumim - 2002-06-18, 13:16:04
そう。解答はいくつか(大きく分けて2種類)考えられます。--sumim - 2002-06-18, 13:16:32
日本代表地元利府で敗れる(T-T)。
さてさて、今回の課題も難しいです。
selfは、「地球人」「ムーンレイス」を示すものですよね?
で、これが地球人の場合は、好意対象にキエル、ムーンレイスならディアナを登録するようにif条件式を入れるのかなぁと思うのですが、いろいろやってみてもうまくいきません。
この刺激自体は対象オブジェクトである「ある人間」の名前の登録の時、一緒にカテゴリー「地球人」「ムーンレイス」、瞳の色、性別を登録するものですよね?
この時に自動的に好意対象を組み込むという形なのですが……仕組みが考えつきません。
うーん。解答は二つ、ということですが、ヒントお願いしますm(_ _)m。--さ茂 - 2002-06-18, 20:40:41
>selfは、「地球人」「ムーンレイス」を示す
そうですね。だとすると、その局面で、
self = ムーンレイス
は、どういうときに何をはき出しますか?--sumim - 2002-06-18, 21:09:35
「=」は前に使った比較で、=ならture、そうでないならfalseを吐き出しますよね?
例えば、
ロラン _ ムーンレイス new の: 'ロラン・セアック' 瞳の色は: '緑' で: '男'
という刺激を与える時、
self = ムーンレイス はtureですよね?
だと思って、
の: ある名前 瞳の色は: ある色 で: 男か女
"基本的な状態を設定した「ある人間」を返す"
self new の: ある名前 瞳の色は: ある色 で: 男か女,
self = ムーンレイス
ifture[好意印象 _ ディアナ]
iffalse[好意印象 _ キエル]
かなぁと思ったんですが駄目です(T-T)。--さ茂 - 2002-06-18, 22:26:01
イタリア、破れる! 韓国、やりますね…。さ茂さんもいい線、行っていますよ。
さて、好意対象という名札ですが、これは、人間という設計図・仕様書(つまりクラス)中の設計・仕様でしか使えません。つまり、人間 class では使えないのです。好意対象に何かを繋げるためには、「ある人間 が好きなのは: ディアナ」のようにしなければいけません。ここで“ある人間”は「self new の: ある名前 瞳の色は: ある色 で: 男か女 」がはき出すオブジェクトですね。これをどこかにつなぎ止めておき、それに対して「が好きなのは:」という刺激を与えなければいけません。使い捨ての名札、それは…? --sumim - 2002-06-18, 22:50:35
>self new の: ある名前 瞳の色は: ある色 で: 男か女,
でカンマを使っておられますが、これはピリオドです。Smalltalk 語では、文と文の区切りはピリオドを使います。「オブジェクト 刺激. オブジェクト 刺激」という具合です。ちなみに改行は文を見やすくするために使うだけで特に意味を持ちません。ですから、
オブジェクト
刺激. オブジェクト
刺激
としても「オブジェクト 刺激. オブジェクト 刺激」と解釈してくれます。ちなみにカンマは 'あいう', 'えお' のように使って、文字列などの結合のための刺激として使います。--sumim - 2002-06-18, 22:55:17
日本に続き、我が宮城県が応援しているアズーリ・イタリアが負けました(T-T)。
今日は悲しい日です……。
で、こんな日についにローカル変数ですね(^-^;)。
の: ある名前 瞳の色は: ある色 で: 男か女
"基本的な状態を設定した「ある人間」を返す"
| 登場人物 |
登場人物 _ (self new の: ある名前 瞳の色は: ある色 で: 男か女)
self = ムーンレイス
ifture [登場人物 が好きなのは: ディアナ]
iffalse [登場人物 が好きなのは: キエル]
では駄目でした。
うーん。わからない(T-T)。あぁアズーリ……(T-T)。--さ茂 - 2002-06-18, 23:11:25
では、解答その1です。いいセン、いっているんですけどね。あと、細かいスペルや大文字小文字の区別、 : の抜け落ちに注意してください。
の: ある名前 瞳の色は: ある色 で: 男か女
"基本的な状態を設定した「ある人間」を返す"
| 登場人物 |
登場人物 _ (self new の: ある名前 瞳の色は: ある色 で: 男か女).
self = ムーンレイス
ifTrue: [登場人物 が好きなのは: ディアナ]
ifFalse: [登場人物 が好きなのは: キエル].
^ 登場人物
これで行けるはずです。とりあえず。--sumim - 2002-06-18, 23:17:35
移動しましょう
このページを編集 (31950 bytes)
|
以下の 2 ページから参照されています。 |
This page has been visited 6253 times.