ロランとディアナ6
ここからの続き…
無事revertしました。
凄い機能ですね!
……ただ、履歴が一杯あって、これってちょっとお腹一杯になりそうです(^-^;)。
この履歴、奇麗さっぱり空にすることはできますか? いずれチャンドラに主Squeak執筆環境を移行する時、やはりヴォリュームが気になります。
あ、これは余談です。
余談ついでに、Win95上のSqueakがどうも遅いです。
ザウルスでも走るSqueak=軽快・軽量というイメージがあったので残念です。何か良い手が無いかと思案中です。
あ、そろそろ今夜はこのへんで。--さ茂 - 2002-06-27, 23:47:41
>この履歴、奇麗さっぱり空にすることはできますか?
できますが、その方法はいずれまた(笑)。「どうです! すばらしいでしょう?」と自慢したかったのですが、そういう反応が返ってくるとは…予想外でした。こうなると、刺激の定義の履歴どころか、print-it も逐一残っている…とは言いにくくなりますね(^_^;)。まあ、前にも申し上げましたが、“無駄”な部分を気にしだすと Squeak では何かとやりにくくなりますので、気持ちを早めに切り換えていただけると嬉しいです。--sumim - 2002-06-28, 00:11:38
おはようございます。
>「どうです! すばらしいでしょう?」
凄いですよ!
>print-it も逐一残っている
それも凄い! これも教えて下さい。
>そういう反応が返ってくるとは…予想外でした。
凄いことに変わりはありません。が、現段階で21MBある.imageファイル、12MBある.changesファイルがどこまでしぼれるかも『執筆環境』同様問題な訳でして(^-^;)。<いずれCFなどのストレージに入れてWinMac共通の環境(VMは別途ストレージに同梱)にしたいんです
>“無駄”な部分を気にしだすと Squeak では何かとやりにくくなりますので、気持ちを早めに切り換えていただけると嬉しいです。
もちろん無駄とは思ってません。あまりの奥の深さに目が回ることはありますが(^-^;)。--さ茂 - 2002-06-28, 06:35:36
まあ、システムの全体像を掴んで技術的にも応用が利くようになったらなんでも好きなようにやってください。それまでのガイド役はできるだけ勤めさせていただきたいと思います。--sumim
さて、古いバージョンにもどしたわけですが、「人間 class >> #の:瞳の色は:で:」はまだ蚊帳の外で、これが使われることは今のところありません。しかし、ある“仕組み”を使うと、「ムーンレイス class >> #の:瞳の色は:で:」もしくは「地球人 class >> #の:瞳の色は:で:」から呼び出すことができるようになります。これは実際にはしないで頂きたいのですが、ちょっと頭の体操です。今、仮に「ムーンレイス class >> #の:瞳の色は:で:」で
の: ある名前 瞳の色は: ある色 で: 男か女
"基本的な状態を設定した「あるムーンレイス」を返す"
| 登場人物 |
登場人物 _ (self の: ある名前 瞳の色は: ある色 で: 男か女).
登場人物 が好きなのは: (self の: 'ディアナ・ソレル').
^ 登場人物
としたとき、どんなことが起こると予想されますか?(まあ「しないで…」というところからおおかた予想は付くと思いますが(^_^;)) これは以前の new のおさらいでもあります。--sumim - 2002-06-28, 10:31:51
間が空きました。すみませんm(_ _)m。
う……。
seifにnewの刺激を与えないということは……。
「ムーンレイス」自身に名前、瞳の色、性別、好意対象を登録しちゃうんですよね? 可能かどうかはわかりませんが。
「あるムーンレイス」を生み出さないで。--さ茂 - 2002-07-01, 06:43:57
- >間が空きました。 お気になさらず、さ茂さんのペースで大丈夫ですよ(^_^;)。--sumim
話をもっと簡単にしましょう。「ムーンレイス の: '兵士' 瞳の色は: '黒' で: '男'」を print-it などしたとき、「ムーンレイス class >> #の:瞳の色は:で:」の self にはムーンレイスが入りますから、元の記述を
の: ある名前 瞳の色は: ある色 で: 男か女
^ ムーンレイス の: ある名前 瞳の色は: ある色 で: 男か女
としたときに何が起こるか…と単純化することができます。--sumim
さて、この状態で「ムーンレイス の: '兵士' 瞳の色は: '黒' で: '男'」を print-it すると、当然、ムーンレイスは「ムーンレイス class >> #の:瞳の色は:で:」の記述、つまり、上の単純化した内容に従って反応を返そうとします。そこでまず、最初の行、つまり「^ ムーンレイス の: ある名前 瞳の色は: ある色 で: 男か女」を実行することになります。ある名前には '兵士'、ある色には '黒'、男か女かには '男' がつながっていますから、換言すると「^ ムーンレイス の: '兵士' 瞳の色は: '黒' で: '男'」を実行しようとすると言うことになります。これは、そもそものきっかけである print-it しようとした「ムーンレイス の: '兵士' 瞳の色は: '黒' で: '男'」とまったく同じものであることに気が付かれるでしょう。つまり「ムーンレイス class >> #の:瞳の色は:で:」を参照し続け、いわゆる無限ループに陥ってしまうのです。--sumim - 2002-07-01, 10:06:55
延々……。なるほど。
単純に「ムーンレイス」に項目を追加すると思いました。
これはわざとですが、気をつけないとわたしも同じような無限刺激を作ってしまうかも知れません。<いろいろイタズラするんで(^-^;)。--さ茂 - 2002-07-01, 12:30:27
ちなみに無限ループからの脱出は、コマンド+「.」(ピリオド)です。--sumim
さて、ここでくだんの「仕組み」を用いてみましょう。
の: ある名前 瞳の色は: ある色 で: 男か女
"基本的な状態を設定した「あるムーンレイス」を返す"
| 登場人物 |
登場人物 _ (super の: ある名前 瞳の色は: ある色 で: 男か女).
登場人物 が好きなのは: (self の: 'ディアナ・ソレル').
^ 登場人物
と、self の代わりに super を使います。super は self と同じ偽変数でここでは self と同じムーンレイスにつながっています。self と違うのは super につながっているオブジェクトに刺激を与えたときは、その super を使った記述が含まれるクラス以下、すべてのサブクラスにある刺激の定義を無視する仕組みが働くことです。別の言葉でいうと、super につながっているオブジェクト(この場合ムーンレイス)に刺激を与えた場合、super を含む定義が記述されたクラス(ムーンレイス class)のスーパークラス(人間 class)から刺激の定義を探すとういう仕組みです。ちょっとややこしいですが、これで「ムーンレイス の: '兵士' 瞳の色は: '黒' で: '男'」の場合、ムーンレイスではなく、そのスーパークラスである人間に刺激「#の:瞳の色は:で:」の定義を探しにいくので、無限ループを回避することができます。--sumim - 2002-07-01, 16:15:24
間が空きましたm(_ _)m。
予習復習用にSmalltalkの教本を一冊Getしました。
「サクサクSmalltalk」です(^-^)。刊行が新しかったんで選んだんですが。
Squeakとインターフェースが少し違いますが基本は一緒ですね。ついさっきsuperも予習してたりします。<どこまで理解してるかは別として(^-^;)。
追伸:Squeakの洋書も一冊注文しました。……読めるか疑問ですが(^-^;) --さ茂 - 2002-07-02, 21:54:12
Squeak の洋書は何色の表紙のを購入されましたか? ちなみに個人的には黄色のをお薦めしています。--sumim - 2002-07-03, 13:00:01
まだ届いてませんが黄色だったはず……です。
今「サクサク……」で今まで教えていただいてきたことをおさらいしているところです。
が、ちょっと専門的過ぎたのかもしれません(^-^;)。ブロックの表記のところで引っ掛かってます。
ifTrue:のところでも使ったんですが、正しい理解かどうか曖昧になってます。うーん(^-^;)。何度も読み直してるんですが……。--さ茂 - 2002-07-04, 19:54:35
>ブロックの表記のところで引っ掛かって
なにに引っかかっていますか? ウチにもサクサクあるので、ページ数を言っていただければ。--sumim - 2002-07-04, 21:00:08
全体的にです(^-^;)。P39〜
[ ]でくくった瞬間、何が起こっているのか認識できなくなってしまう自分を発見しちゃいました(T-T)。
パラメータの指示(:と|)はさらにちんぷんかんぷん。
うーん。軌道修正お願いしますm(_ _)m。--さ茂 - 2002-07-04, 23:27:26
人間class >> の: ある名前 の、
"ある名前のある人間を返す"
|候補|
候補 _ self allInstances select: [ :ある人間 | ある人間 の名前 = ある名前 ].
^ (候補 size > 0) ifTrue: [ 候補 first ] ifFalse: [ nil ]
ここまで後退中(T-T)。とほほ。--さ茂 - 2002-07-04, 23:33:18
[ ] はその中にプログラムを記述することで、それをつなぎ止めておくことができるオブジェクトです。value という刺激を受けて、中のプログラムを実行することができます。[ :変数 | "変数を使った処理" ] としたとき、value: あるオブジェクト というオブジェクトを伴う刺激を与えて、変数に「あるオブジェクト」を入れた状態でプログラムを実行させることもできます。--sumim - 2002-07-05, 14:58:44
ここまでは大丈夫ですか?--sumim - 2002-07-05, 14:59:37
難しいです(T-T)。
サクサクの記述では『遅延実行』という表現を使っていますが、これは『つなぎとめる』と同義ですよね?
↑この式はブロックの他にallInstances select:も謎なわけです(^-^;)。
グローバル変数なしで"ある人間"を参照するため、という説明でしたがまだ消化不良ですm(_ _)m。
|あるブロック |
あるブロック _ [ 3 + 4 ].
あるブロック value
という例題まで戻れば、[ ]で括った刺激によって生まれたオブジェクト(答え)「7」を一時変数「あるブロック」で捕まえて、それにvalueという刺激を与えて「7」を吐かせる……んですよね? --さ茂 - 2002-07-05, 18:54:01
(さ茂さんへ --abee) - 2002-07-06, 00:02:03
いえ、答えではなく、[ ] で括ったコード(手続き)自体をオブジェクトとして扱うためのオブジェクトです。あるブロック _ [ 3 + 4 ] としたときは「3 に 4 を伴う + という刺激を与える」という言うなれば“手続きオブジェクト”を「あるブロック」という名札に繋げます。「あるブロック value」とすることで、あるブロックという名札につながっている [ 3 + 4 ] というオブジェクトに value という刺激が与えられ、7 という答えがはき出されるしくみです。--sumim - 2002-07-06, 04:40:32
「あるブロック」にvalue刺激が与えられた時に、 名札「あるブロック」に繋がる[ 3 + 4 ] から7が吐き出される。だから「つなぎとめ」であり「遅延」ということなのですね?
では同じように、↑
候補 _ self allInstances select: [ :ある人間 | ある人間 の名前 = ある名前 ].
これはselfに、allInstances select:[〜]刺激が与えられると、[ブロック内]で、ある人間にある名前を登録して、それを候補という一時変数で捕まえる。
それで、allInstances select: の部分を調べると、
selfに属するインスタンス(この場合は、あるムーンレイスかある地球人)全てにメッセージを送るもので、select:は「新しいコレクションを作成する」刺激ということです……が? サクサクは難解です(^-^;)。
最後の行は↑先に述べたような考え方でよろしいですか? --さ茂 - 2002-07-06, 08:19:59
まず、self allInstances からいきましょう。allInstances という刺激を設計図・仕様書(クラス)に送ると、その設計・仕様に従って作られたオブジェクト(インスタンス)をつなぎ止めた「ある Array」(以下、“ある”を省略して単に Array )というオブジェクトをはき出します。たとえば、ムーンレイス allInstances を inspect-it すると、すでに生み出されたムーンレイスたちを一覧できます。--sumim - 2002-07-06, 14:02:13
次に select: ですが、これは Array のように複数のオブジェクトをつなぎ止めているタイプのオブジェクトが受け付ける刺激で、かならずブロックを伴って与えられます。また、ブロックならなんでもいいというわけではなく、決まった仕様を持っている必要があります。それは、1) 変数をひとつもつこと。2) コードの最後で true か false がはき出されること、です。Array は自分が繋ぎとめているオブジェクトたちおのおのについて、くだんのブロックに value: という刺激に伴わせて与えたとき、true を返すものだけ集めて新しい Array をはき出します。たとえば、
#(1 2 3 4 5) select: [ :ある数 | ある数 even ]
を inspect-it すると、偶数(even)のみが抽出された新しい Array がはき出されるのがわかります。even という刺激は、数に与えられたとき、それが偶数なら true を、奇数なら false をはき出させます。--sumim - 2002-07-06, 14:12:20
#(1 2 3 4 5)、つまり 1、2、3、4、5 という数を繋ぎとめた Array は、それぞれの数について、[ :ある数 | ある数 even ] value: 1、[ :ある数 | ある数 even ] value: 2、…、などというように select: に伴って与えられたブロックに刺激を与えて、true を返す数だけ集めます。value: は伴うオブジェクトを、ブロック内に指定された変数に代入してからブロック内のコードを実行する刺激です。この例では、繋ぎとめられた数のうち even という刺激に true を返すのは 2 と 4 なので、#(2 4) という Array をはき出す、というしくみです。--sumim
ちなみに、#( ) は、括弧の中にスペースで区切ってオブジェクトを並べることで、簡単に Array を作り出すことができる記述方法です。ただ、どんなオブジェクトも可能かというとそうではなく、true や false、nil、数、文字列などのように、それを書いたときそのものを表わす特殊なオブジェクトに限られます。したがって、この記述方法で、たとえばムーンレイスたちをつなぎ止めた Array を記述することはできません。--sumim
#() を使えないオブジェクトを繋ぎとめた Array を作りたいときは「Array」に with:、with:with:、with:with:with: に繋ぎとめたいオブジェクトを伴わせた刺激を与えるか、{ } にピリオドで区切って記述する方法を使います。
Array with: (地球人 の: 'キエル・ハイム') with: (地球人 の: 'グエン・サード・ラインフォード') with: (ムーンレイス の: 'テテス・ハレ')
{地球人 の: 'キエル・ハイム'. 地球人 の: 'グエン・サード・ラインフォード'. ムーンレイス の: 'テテス・ハレ'}
両者は同じ Array を吐きだします。--sumim - 2002-07-06, 15:14:05
刺激 select: については、SequenceableCollection >> #select: などを見るとなにをやっているかの雰囲気がつかめるかと。--sumim - 2002-07-06, 15:42:07
>ムーンレイス allInstances を inspect-it すると、すでに生み出されたムーンレイスたちを一覧できます。
これはすでに「ロランとディアナ3」で教えていただいたものですね。問題はArrayというオブジェクトを理解していないことのようです(T-T)。
サクサクの記述も難解です(T-T)。『整数インデックスを持った配列』とありますがRD3の例でも数字のリストが出てきましたよね?
>次に select: ですが、これは Array のように複数のオブジェクトをつなぎ止めているタイプのオブジェクトが受け付ける刺激で、かならずブロックを伴って与えられます。
サクサクを読み直して納得しました。
>value: は伴うオブジェクトを、ブロック内に指定された変数に代入してからブロック内のコードを実行する刺激です。
忘れていましたがこのvalue:は、↑上の式でも特に記述されていないようなのですが見えないところで処理がされていますね? ↓ここで?
>刺激 select: については、
select: aBlock
"Refer to the comment in Collection|select:."
|aStream|
aStream _ WriteStream on: (self species new: self size).
1 to: self size do:
[:index |
(aBlock value: (self at: index))
ifTrue: [aStream nextPut: (self at: index)]].
^ aStream contents
うわぁ(^-^;)……これはさらに難解。--さ茂 - 2002-07-07, 00:42:25
(aBlock value: (self at: index))
ifTrue: [aStream nextPut: (self at: index)]
だけ見ていただければ。select: と一緒に与えられたブロック(aBlock)に value: に自らの要素(つなぎとめているオブジェクト、self at: index)を伴わせて与えているのが分かると思います。ついでに、これが true を吐きだすなら当該要素(self at: index)を返すオブジェクト(aStream)に追加しているというあたりまで読みとれれば十分です。--sumim - 2002-07-07, 14:08:24
ブロックを伴わせる刺激ということでは ifTrue: も同じです。True >> #ifTrue: を見ると伴わせたブロックに value という刺激(ifTrue: に伴わせるブロックは select: の場合と違い変数を持たないので、value: でないことに注意)を与えているのが分かります。--sumim - 2002-07-07, 14:23:08
valueとvalue:の違いがよくわかりません。
>value: は伴うオブジェクトを、ブロック内に指定された変数に代入してからブロック内のコードを実行する刺激です。
ではvalueは? サクサクを読み返しても?
>value という刺激(ifTrue: に伴わせるブロックは select: の場合と違い変数を持たないので、value: でないことに注意)
select:ブロックは必ず変数を必要とし、ifTrue:は必要としない。
変数を持つブロックにはvalue:、持たないブロックにはvalue。このあたりがよくわかりません(T-T)。
追伸:Squeakの本は黄色で、『SQUEAK A QUICK TRIP TO OBJECTLAND』でした。英語だぁ……(^-^;)。--さ茂 - 2002-07-07, 19:55:29
>valueとvalue:の違いがよくわかりません。
ブロック内に関連づけを待っている変数があるときは value: 、ないときは value です。ブロック内で関連づけを待つ変数の宣言は、変数名の前に「:」、宣言の最後に「|」をブロック内の記述の最初に挿入します。ブロック内で関連づけを待つ変数は必要なら複数用意することができます。そのときは value:value: 、value:value:value: など、変数の数だけオブジェクトを与えられるよう個別に用意された刺激を使います。
[3 + 4] value
[(ムーンレイス の: 'ロラン・セアック') が好きな人] value
[ :a | a + 4 ] value: 3
[ :a :b | a + b ] value: 3 value: 4
[ :ある名前 | (ムーンレイス の: ある名前) が好きな人] value: 'ロラン・セアック'
という具合です。いかがでしょう。--sumim - 2002-07-07, 20:06:24
(! --abee) ありがとうございます。直しておきました。--sumim - 2002-07-07, 21:33:47
>ブロック内に関連づけを待っている変数があるときは value: 、ないときは value です。
例題を実際Print-itして見て少し理解できました。
外から変数に代入する場合は、value:代入するオブジェクト
で、ブロック内にすでに定数的に示されている時は単純にvalueの刺激でブロック内の反応を返すという感じでしょうか?
言い方が(絶対!)間違っていると思いますが(^-^;)、感覚的にそう理解してます。
用語であるとか言い回しとかの基本的なところがまだ理解不十分であると思います。
悩んだ時には必ず過去の場をgrep検索して読み返すように今しているのですが……。
それで、一度これまでのおさらい的な課題を(いつものことながら落第点かと思いますがm(_ _)m)お願いできませんでしょうか?
どうも停滞の極みという感じに思え、とても不安なのです。
突破口になるや? と「サクサク」で予習復習しても、用語、言い回しの(些細な)違いに戸惑いますし、洋書は……ちょっと背伸びしすぎだったかもしれません(^-^;)。
勝手なお願いですが、どうかご検討願いますm(_ _)m。 --さ茂 - 2002-07-08, 19:31:19
>一度これまでのおさらい的な課題を
これまでのところで分からないところがあれば、具体的に示していただければ適宜、フォローしますよ。私の印象では、リアクション(さ茂さんなりのまとめ) をご呈示していただけず、コンセンサスのない状態でしかたなく次に進んだところは、たぶんアウトっぽいとは思うのですが…(^_^;)。--sumim - 2002-07-08, 20:08:42
復習のページへ続く。
このページを編集 (16778 bytes)
|
以下の 2 ページから参照されています。 |
- ロランとディアナ5 最終更新: 2002-06-27, 23:36:53 <p2035-i>
- 復習のページ 最終更新: 2002-07-20, 13:47:16 <192>
This page has been visited 3460 times.