ちゃんとレッスンに目を通してから質問してね…。さめざめ
ちょっとごたごたで、お休みしてましたが、つい最近「どうすればいいのだ?」という疑問が出てきたので投稿させてください。それは、プログラムで何かをつくるとかいう体験をするのに、Logoがやっぱ手軽かなあ、Squeak日本語版は高級感があっていいよなあ、って迷っているさなか、僕はラフに、e-ToyはLogoの高級版みたいに考えていたのです。(だって、書いた絵がタートルになるみたいなもんですよね)そこでLogoのプログラムをe-Toyに書き換えようとしたら「くりかえせ 4 云々」みたいな処理ができない。そういえば、ビューワを開くと、モルフによってメニューが微妙にちがっていますが、その、なんていうか何回か処理を繰り返して終りというタイルはすぐに作れるのでしょうか?smalltalk 的に考えると数字モルフっていうやつを作って、その手続きに「くりかえせ」みたいなのが入ってるっていうイメージなんですけど。タイルをつくるのはむずかしいとしても、何回かくりかえして終わりという処理をe-Toyで実現するにはどのような方法があるのでしょうか?ちなみに、ひらがなやアルファベットが持ってる「インスタンス変数」の「index」というのは何を表しているんでしょうか?一見、A,B,C,...と数えたときの何番目かという数字が入ってるようですが、どうもこれを変化させてもなにもおこらないので繰り返しの変数として利用できたりします。つまり、この変数が「4」を超えたら処理をやめるとか。なんていうか、もっとエレガントな方法はないんでしょうか? −−Lem - 2002-07-29, 12:20:23
- (eToys は商標の関係で SqueakToys と表記するようになりました。) SqueakToys はそれ自身がループなので、特にループパネルのようなものは設けられていないのでしょうね。おっしゃるとおり、インスタンス変数を用いて条件分岐させるのがエレガントではないけれど、確実だと思います。ひらがなやアルファベットがデフォで持っているインスタンス変数はなんだかよく分かりませんでした。ごめんなさい。--sumim - 2002-07-29, 14:51:56
- あと、SqueakToys ではあまり“Smalltalk 的”、つまりオブジェクトにメッセージを送ることですべてが進行する…というふうには考えない方がよいですよ(^_^;)。動くコードを臨機応変に記述するスタンスが吉かと。それ自体は Self ベースなので、Smalltalk とはちょっと趣を異にしますし、なにより Self だとしても、かなり極端にデフォルメされたサブセットなので、作法を云々して美しいコードを仕上げるのに必要なポテンシャルをそもそもが持ち合わせていないように思われます。--sumim - 2002-07-29, 14:55:31
- このsumimさんの指摘は重要です。
例えば、タートルグラフィックで四角形を描くプログラムはSmalltalkでは次のようになります。
| turtle |
turtle _ Pen new.
4 timesRepeat: [
turtle go: 100.
turtle turn: 90]
以下に示したSqueakToysの例に比べて、ループのカウンタが隠蔽されるなど、とてもきれいです。
並行プロセスやアニメーションなどSqueakToysの特性にマッチしたプログラムの場合は、Smalltalkよりもはるかに迅速かつきれいに書けることも多いのですが、そうでない場合は無理をせざるを得ないこともあります。ありふれた言い回しですが、要は適材適所ということではないでしょうか。--abee - 2002-07-30, 22:42:00
- インスタンス変数を追加してカウンタを使う方法ですが、こんな感じ(turtleGraphics.pr)でいかがでしょうか。
ひらがなやアルファベットが、部品フラップにあるものだとすると、これらはPasteUpMorphのインスタンスで、インスタンス変数にindexはありません。説明されている内容からするとcursor(カーソル)が近いような気もします。カーソルはホルダの要素中のどれを指しているかを示す値で、それが指している位置にあるプレイヤや画像を参照するために用いられます。これをカウンタとして流用した場合、当然参照位置も変わるので、場合によっては副作用があります。--abee - 2002-07-30, 00:51:26
Sumiさんabeeさんレスをありがとうございます。僕は少し認識不足のところがありました。というのは、オブジェクトのインスタンス変数が自由につくれるなんて知らなかったのです。Sumimさんの文章からそういうことができることが伺えたのでメニューみたらありました。僕は最初、アルファベットやひらがななどがデフォルトで持ってるインスタンス変数を見て、これを制御に使うのかなあ?なんて誤解してとても難解なプログラムを作成していました。ちなみにひらがなやアルファベットは部品フラップにあるものですが、「index」っていう名前のインスタンス変数がデフォルトで存在しているんです。あとで作ったプログラムは偶然にも(いや、必然かな)abeeさんのアップされたturtleGraphics.pr にそっくりでした(^。^)
ところでSqueakToysがそれ自体ループというのはよくわかります。ループになっているせいか、今回いじってると、SqueakToysは必然的にスクリプトのユニットに分けていかざるを得ないような作りになってるように感じました。--Lem - 2002-07-30, 14:45:01
- さめざめ…。>「インスタンス変数が自由につくれるなんて知らなかった」--sumim - 2002-07-30, 19:12:57
- うまくいったようで良かったです。
もしかしたら、言葉に食い違いがあるかもしれないのですが、あるオブジェクト(インスタンス)のインスタンス変数といった場合、その変数名の集合はそのインスタンスを生成したクラスに対して、メッセージallInstVarNamesを送った結果となります。「アルファベット」や「ひらがな」はPasteUpMorphクラスのインスタンスですから「PasteUpMorph allInstVarNames」をprint itした結果を見れば良いことになります。この中にindexはありませんでした。ただし、インスタンスベースのSqueakToysの場合は、ユーザが直接モーフのクラスを変更することができませんから、ビューワからインスタンス変数を追加した場合は、そのモーフをコスチュームとして持つプレイヤのクラスのインスタンス変数として定義されます。このプレイヤのクラスは暗黙の内に自動的に生成されますが、「アルファベット」や「ひらがな」のプレイヤクラス(PlayerXX)にもインスタンス変数のindexはありませんでした。以上が、インスタンス変数のindexがないと書いた理由です。--abee - 2002-07-30, 22:23:00
さめざめさせてしまいましたか、ははは>sumimさん。だけど、SqueakToysをさわって遊んでるときは一回も制御のための変数の必要性にかられなかったので、思いもよらなかったんですよ。ただ、アルファベットのAとかのビューワを開くといきなり「インスタンス変数」とかあって(普通はこれないですよね)これを見るのは初めてだったのです。僕が「インスタンス変数」ってここで呼んでいるのはSmalltalkのそれではなくてSqueakToysのタイルスクリプティングのビューワに出るやつです。でもって今日本語Squeakでabeeさんの言われるアルファベット「A」のプレイヤクラスをみたら、中に「index」という変数がありました。どうやったかというと、アルファベット「A」のビューワから適当にタイルをだして、スクリプトをコードにしたときの「self」をインスペクトしたんですが、これで良いですよね。 - 2002-07-30, 23:29:57
- index のこと、分かりました。「アルファベット」から察するに「ひらがな」はMissing File (/morphiclesson/uploads/StandardScript%5FithHiragana.st)な仕様のほうがいいかも知れませんね。この index はアルファベットやひらがなの順番が自動的に入るようになっているので、SqueakToys では asciiValue が取れないその代わりをさせるもくろみがあるように思います。したがって、改めてこの index の数値を変えて何かが起こるとか、何かをするということは想定されていないでしょう(PlayerXX >> #getIndex: は整合性を保つため一応用意されていますが…)。--sumim - 2002-07-30, 23:29:46
- 自分で作ったことすら忘れていました。ほとんどholderWithAlphabetのコピペだし。いただいた変更案は次回使わせていただきます。ありがとうございました。--abee - 2002-07-31, 19:08:26
- 了解です。ありがとうございましたsumimさん-Lem - 2002-07-30, 23:31:26
- 私もindexの件、了解しました。個々の文字の方だったのですね。大変失礼しました。先入観に囚われていました。--abee - 2002-07-31, 19:03:26
- さめざめ…。>「一回も制御のための変数の必要性にかられなかった」 --sumim - 2002-07-30, 23:39:49
うーん、ちゃんと読んでないのがばれちゃいましたね(^_^;)だけど、道にそって動くゴーカートなんかを作って遊んでる分には、用意された変数だけで事足りちゃったりしたんですよ。ともあれ、二度も「さめざめ」とさせて申し訳ない(汗)-Lem - 2002-07-31, 00:15:49
このページを編集 (7491 bytes)
|
以下の 1 ページから参照されています。 |
This page has been visited 3719 times.