SqueakToys その1 …とクラス-インスタンス談義ちょっと
では、まあ、モーフの扱いについては日本で二番目に詳しくなっていただいたところで(笑)、SqueakToys、タイルスクリプトシステムをちょっとさらいましょう。--sumim - 2002-11-28, 11:08:32
タイルスクリプトシステム(単にスクリプトシステムとも)は、どのモーフでも同じように使うことができますが、特にスケッチモーフに特化される傾向にあるので、ここではスケッチを使います。なにか適当な絵を描いてください。--sumim - 2002-11-28, 11:11:00
そうだ。ちょうどいいので今日、予定しているデモをやってみましょう(笑)。まず、例によって車を描きます。--sumim - 2002-11-28, 11:12:13
>モーフの扱いについては日本で二番目に詳しく
そんなわきゃぁないっす(苦笑)
それはさておき,新しいプロジェクトにF-15(らしきもの)を描きました.
あ,そうそう.今日は午後からQTSSのセミナーで,その後はアレですね.よろしくお願いします.--人狼 - 2002-11-28, 11:14:15
あ、それなら対抗(?)して F-22 かなにかにすればよかったなあ(笑)。こちらこそ、どうぞよろしくお願いします。<例の(笑)--sumim - 2002-11-28, 11:20:58
このスケッチを選択して名前を付けます。私は「Car」とでもします。--sumim - 2002-11-28, 11:21:43
いえ,やはりsumimさんはF-16でしょう(笑)楽しみにしてます>例の.
さて,私は「Eagle」と名付けました.--人狼 - 2002-11-28, 11:23:45
いや、ちょっと最近ラプトーがプチ・マイブームなんすよ(笑)。あんな便利な機体があるなら F-16 で苦労してクリアすることもなかったなぁ…と(^_^;)。食わず嫌いってやつですね。まあ、それはいいとして…。--sumim - 2002-11-28, 11:26:17
左手中央のビューワ表示“水色”ハローをクリックします。--sumim - 2002-11-28, 11:27:03
見てとれるように、ビューワはまず、対応するモーフの様々な内部情報を表示する役割りがあります。たとえばここで、Car をドラッグすると、Car's x 、Car's y の値が変わります。回転させれば Car's heading の値の変化を見ることもできるでしょう。--sumim - 2002-11-28, 11:30:57
逆に、状態を変化させる機能も提供されています。紫の矢印が描かれてる欄がそれで、矢印の右側にあるボックスの内容を緑の上下矢印ボタンや、キーボードから直接、場合によってはクリックで表示されるメニューから項目を選択することで自在に変化させられます。例えば、Car's x ← 100 、 Car's y ← 100 とそれぞれ入力して return キーを押すか accept (cmd-s)すると指定した場所(上から 100 ドット、左から 100 ドット目の位置)に Car が移動します。--sumim - 2002-11-28, 11:34:18
OKです.移動や回転によるx,y,headingの値の変化と,値を変化させてモーフが移動したり回転するのを確認しました.後は偶然にも「isUnderMouse」も--人狼 - 2002-11-28, 11:34:37
黄色の ! ボタンは、その欄に書かれていることをモーフにさせます。たとえば、Car forward by 5 の ! をクリックすると Car は前に5ドット前進(5ドット上に移動)します。--sumim - 2002-11-28, 11:35:45
OKです.前後移動や回転を試してみました.--人狼 - 2002-11-28, 11:38:42
で、こられはスクリプトに組み込んで連続して繰り返して実行させることができます。Car forward by 5 の forward のところをクリックするとフレーズと言われるパネルをピックアップできるので、これをデスクトップにドロップします。すると、スクリプティと呼ばれる枠ができ、スクリプトに早変わりします。--sumim - 2002-11-28, 11:42:45
スクリプティには別のフレーズ(例えば Car trun by 5 )を同様にしてドロップインして追加できます。このとき、デスクトップにドロップしてしまうとスクリプティができて別のスクリプトになってしまうので注意が必要です。TIPS として無用なフレーズをあやまってピックアップしてしまった場合、ゴミ箱が画面になければ(あれば、そこにドロップイン)ビューワフラップ内でドロップするとキャンセルされます。--sumim - 2002-11-28, 11:45:13
>forword のところをクリック
間違えてEagleのところをクリックしても同じパネルが出てきました.後,以前タイルスクリプトで遊んだ時には5の右横の三角(右向)をクリックしても出てきました.これはforwardのところをクリックするのが良いのですね.--人狼 - 2002-11-28, 11:45:57
紫色の矢印のないフレーズではピックアップできればどこをクリックしても構いません。紫色の時は、紫色の部分をクリックした場合と、フレーズをクリックした場合でピックアップされるフレーズタイルの役割りが変わります(値の代入と値の参照)。値の参照のフレーズタイルの場合は、条件分岐タイルの条件を見る欄などでないとドロップインできません。--sumim - 2002-11-28, 11:49:17
>別のフレーズ(例えば Car trun by 5 )を同様にしてドロップインして追加
スクリプティにドロップインする時に既存のフレーズとの上下関係は今のところは気にしなくて大丈夫でしょうか?キャンセルの方法は了解しました.--人狼 - 2002-11-28, 11:47:54
読み下して、意味が変わらなければ前後関係は気にしなくて大丈夫です。上流の処理で値が変わると下流の処理に影響がでる場合は、通常のプログラミングと同様に配慮する必要があります。--sumim - 2002-11-28, 11:51:11
>紫色の矢印のないフレーズではピックアップできればどこをクリックしても
了解しました.条件分岐タイルが出てきた時に(出てきますよね?)値の参照と言うフレーズが判るのでしょうね.--人狼 - 2002-11-28, 11:52:53
スクリプトにも名前を付けることができます。スクリプティの中央上部に書かれた script1 というのがそれです。クリックして別の名前に変えることができます(もちろん、タイプしたあとは return か accept )。他のスクリプトから参照したいときに備えて、名前は相応しいものに変えておく習慣を付けておくのがよいでしょう。--sumim - 2002-11-28, 11:53:12
>上流の処理で値が変わると下流の処理に影響がでる場合
了解です.今回のように前進んで,回って,と言うのはお互いに影響しないので順番は関係しませんね.--人狼 - 2002-11-28, 11:53:56
>スクリプトにも名前を付けることができます
スクリプティもオブジェクトなんですよね,きっと.
>他のスクリプトから参照したいときに備えて
そんな使い方もありなんですね.--人狼 - 2002-11-28, 11:54:53
スクリプティもオブジェクトですが、それより前ににモーフでもあります。ここでピックアップしたりドロップインしているフレーズやその中のタイルもみなそうです。--sumim
>条件分岐タイルが出てきた時
忘れると面倒なので、もう出してしまいましょう(笑)。条件分岐タイルはスクリプティの右上にある肌色の矩形領域をクリックすることでピックアップできます。そのあと、スクリプト内の適当な場所にドロップインします。--sumim - 2002-11-28, 11:59:06
このパネルの Test のところに値を見るフレーズをドロップインします。すると、その値をどのように判定するかを決めるための式に変化しますので、相応しいものに変えます。フレーズが返す値が true もしくは false の場合に限り、評価式への変換は行なわれません。いずれにせよ、この行で true(Yes)もしくは false(No)の値が得られるので、その結果に従って、したの Yes もしくは No の欄に挿入されたフレーズが実行されます。--sumim - 2002-11-28, 12:09:09
ここでは、こんなスクリプトを組んでみました(ちなみに今日のデモ内容からはすでに離れています。だって5分しかとれないんだもん(笑))。スクリプティの時計のアイコンをクリックするとスクリプトが動作し始めます。動作中もスクリプトの編集は可能です。止めるには再び時計アイコンをクリックします。時計アイコンを長押しすると、スクリプトの実行速度を変えられます。--sumim - 2002-11-28, 12:11:40
スクリプトを一度だけ実行するには、左手の ! ボタンを時計ボタンの代わりにクリックします。○ボタンはスクリプティを閉じるためのもので、×印はスクリプトごと削除するためのものです。--sumim - 2002-11-28, 12:14:03
セミナー中なので,一つだけ(苦笑)今日のデモは15分でお願いします--人狼 - 2002-11-28, 15:08:50
だめですよ。ちゃんと講義聴かないと…(笑)。Swiki 5分、SqueakToys 5分、Croquet 5分でがんばります(^_^;)。--sumim - 2002-11-28, 15:47:15
今は休憩なので(^^;了解しました.Croquetは衝撃的でしょうねぇ.よろしくお願いします.--人狼 - 2002-11-28, 15:52:51
おはようございます.昨日は有り難うございました.大変楽しい時間を過ごせました.と,言う事でこれから続きを勉強します.--人狼 - 2002-11-29, 09:11:44
こちらこそ。楽しかったです。ありがとうございました。--sumim
条件分岐を試してみました.値の参照のフレーズスタイルの時は条件分岐タイルの条件の欄のみ…でしたよね.紫の矢印のあるフレーズであるx,y,headingを条件の欄にドロップイン出来ません.例示頂いたサンプルは動作を確認致しました.(前に5,後ろに5なので,止まって見えました.片方だけにすると,ちゃんと前進/後進しました)--人狼 - 2002-11-29, 09:59:59
スクリプトの実行も了解です.ボタンは知りませんでした.
>○ボタンはスクリプティを閉じるためのもの
閉じたスクリプティはどこへ?--人狼 - 2002-11-29, 10:02:02
>前に5,後ろに5なので,止まって見えました.片方だけにすると,ちゃんと前進/後進しました
これ、よく見ていただくと分かるのですが、前に5のほうは、No の方にドロップインしてあります。お試しください。--sumim - 2002-11-29, 10:48:27
>値の参照のフレーズスタイルの時は条件分岐タイルの条件の欄のみ…
値の“参照”のときは、紫の矢印タイルではなく、そのフレーズを象徴するタイルのほうをクリックしてピックアップします。値を“代入”するのに使うときは紫の矢印タイルをクリックしてピックアップします。条件分岐の条件チェックの欄にドロップインするときは前者(値の参照用フレーズ)になります。--sumim - 2002-11-29, 10:50:28
>前に5のほうは、No の方にドロップイン
うぅ,すみません.お手数をおかけしました.ちゃんと動きました.思い通りの場所に誘導はまだ難しですが(汗)--人狼 - 2002-11-29, 10:52:03
>閉じたスクリプティはどこへ?
スクリプティが作成されたときにビューワに新設(というか、もともと隠れていただけなのが現われるだけなのですが)される scripts カテゴリパネルに空スクリプトの直後にフレーズとして登場しているはずです。--sumim - 2002-11-29, 10:57:39
>紫の矢印タイルではなく、そのフレーズを象徴するタイルのほうをクリックしてピックアップします
了解しました.x,y,headingをピックアップすると出来ました.重ね重ねお手数をおかけしました.ここまでは大丈夫だと思います.--人狼 - 2002-11-29, 10:58:58
で、ちょうどいいのでご説明すると、ビューワには現在3つのカテゴリパネルが表示されているはずです。これらは本質的には等価でそれぞれの上部にあるカテゴリ欄をクリックしてポップアップするメニューから選んでその内容を呼び出すことができます。ビューワフラップ内には画面の縦幅が許す限りいくつでもカテゴリパネルを追加できます。カテゴリパネルはビューワフラップ上部、ビューワ自身のクローズボタンの右隣にあるカテゴリパネル追加ボタンを押します。逆にパネルをフラップから削除するためには、各パネルにあるクローズボタンをクリックします。--sumim - 2002-11-29, 11:01:31
scriptsカテゴリパネルで確認できました.このフレーズを使って,前の説明に出てきた「他のスクリプトから参照」をするのですね.空スクリプトはあって良いのですね.「作った覚えない(^^;」とちょっと困惑しました.--人狼 - 2002-11-29, 11:01:40
スクリプティはこの空“emptyScript”スクリプトをデスクトップにドロップインしてもつくることができます。また、ビューワの上部にあるメニューボタンをクリックしたときに現われるビューワメニューから add a new script を選んでも同じことができます。--sumim - 2002-11-29, 11:15:33
カテゴリパネルの追加・削除も確認しました.カテゴリの変更も確認しました.--人狼 - 2002-11-29, 11:16:44
“emptyScript”のドロップイン,add a new scriptによる,スクリプティの作成も試してみました.--人狼 - 2002-11-29, 11:20:27
では、ここまでのおさらいを兼ねて、ちょっとした課題にチャレンジしていただきましょう。理解度をはかるためで、お時間をとらせることが目的ではないので、分からなければどんどん訊いてください。作っていただきたいのは、こんなやつです。--sumim - 2002-11-29, 11:34:51
大きさを変えても青、黄、青に三等分される Rectangle モーフを作ります(サブモーフ、レイアウト、カラーリングの応用)。この上でスケッチモーフが走るとき、黄色では右もしくは左に直進、青では右旋回するようにスクリプトを組んでみてください。--sumim - 2002-11-29, 11:34:51
RoundingCar.pr
このファイルが作品例です。プロジェクトを読込むには、このファイルを仮想イメージと同じディレクトリに置き、デスクトップメニューから load project from file... を選びます。読込まれたプロジェクトは現在のプロジェクトの“子”プロジェクトになるのでプロジェクトを管理するプロジェクトがある場合は、そちらで読込み操作を行なう方がよいでしょう。プロジェクトの書き出しについては、追々。--sumim - 2002-11-29, 11:45:00
遅くなりました.出来た…と思います.--人狼 - 2002-11-29, 14:10:17
では、プロジェクトのファイル出力方法です。デスクトップメニューから save project to file... を選択します。すでにプロジェクトに名前が付いているときは、プロジェクト保存のためのモーフが表示されます。名前をまだ付けていないときは、名前の入力(付け替え)を促されますのでそれに従ってください。プロジェクト保存のためのモーフは下に保存先のディレクトリが、上に保存操作もしくは作業をキャンセルするためのボタンが並んでいます。プロジェクトの保存はネットワークでの公開も含まれますが(くだんの Web ブラウザプラグイン版 Squeak 用途)今は、中央の Save on local disk only を選びます。変なことをしていなければ(笑)、そのまま保存作業が進み、じきに元の画面に戻って終わります。ファイルはデフォでは、仮想イメージのあるディレクトリの Squeaklet というフォルダに保存されるので、確認して Squeaking Squab 課題提出用ページ に添付してください。--sumim - 2002-11-29, 14:34:12
Squeaking Squab 課題提出用ページに添付しました.RoundingF-15.prです.変な事はしていないので,そのまま保存出来ました(笑)--人狼 - 2002-11-29, 14:39:40
すばらしいですね。完璧です。レイアウトがちょっと心配だったのですが、問題ありませんでしたか? いやぁ、すごい。--sumim - 2002-11-29, 14:44:00
レイアウトは,サブモーフの時のご説明が丁度3つのサブモーフでしたのですぐに思い出しました.あの時は,一つだけ,vertical resizingをspace fillにしていて,それだけが縦も綺麗に配置されていたのが,結果としては良いヒントでした.むしろ,悩んだのは黄色のところです.「真横」に動かす為に苦肉の作としてheadingの判断と値指定をしていますが,あれで良いものやら(^^;--人狼 - 2002-11-29, 14:50:00
私のスクリプトを見ていただくとよいのですが、まったく同じです(笑)。--sumim
あ,そうですね.せっかくプロジェクトを頂戴したのですから見れば良いのですね.動かして喜んでました(笑)sumimさんの車も頂けたので,それも嬉しかったりします.と,言う事で見てみました.いや,同じようなスクリプトで安心しました.--人狼 - 2002-11-29, 14:57:04
では、ちょっと息抜きを兼ねて(トラップ付きですが…(^_^;))アニメ機能などを使いながら、SqueakToys をもうちょっといじってみましょう。--sumim - 2002-11-29, 14:46:12
まず、アリの絵を描きます。脚を動かしたいのでこの部分はあとで描きます。とりあえず胴体部分だけ描いて Keep します。--sumim - 2002-11-29, 14:50:41
できたスケッチモーフを緑ハローで複製して、片方ずつ脚や触覚などを微妙に位置替えして描きます。--sumim - 2002-11-29, 14:56:39
描いたら、新しくホルダモーフ(Holder)を作り、そこにドロップインします。ホルダの名前は Ants にしました。--sumim - 2002-11-29, 15:01:56
Holderもーふ,初登場ですね.今のところはまだトラップにはかかってないみたいですね.--人狼 - 2002-11-29, 15:09:03
まだです(笑)。<トラップ 次に、Car モーフ(適当に読み替えてください)のビューワの miscellaneous カテゴリにある Car look like dot フレーズをくだんのスクリプトの先頭に挿入します。スクリプトは停止(paused)状態にしておいたほうがよいでしょう。--sumim - 2002-11-29, 15:18:05
続けて Ants ホルダモーフのビューワを開き、collections カテゴリの Ant's playerAtCursor フレーズをピックアップして、Car look like dot の dot 部分にドロップしてこれを置き換えます。--sumim - 2002-11-29, 15:20:19
最後に basic ビューワカテゴリにある Ants's cursor ← 1 を“代入”フレーズとしてピックアップして、スクリプト中の Car look like Ants's playerAtCursor の直後にドロップして挿入します。--sumim - 2002-11-29, 15:22:36
ドロップした先のフレーズパネルで Ants's cursor ← 1 の cursor のパネルにある緑の上下矢印で cursor increase by に変えます。これでスクリプトを起動してみてください。--sumim - 2002-11-29, 15:25:37
うげっ.F-15が蟻にばけて画面を青と黄のRectangleの上をはいずり回っています.ホルダモーフの方はちらちらと,黒い枠が行ったり来たりと.--人狼 - 2002-11-29, 15:28:24
これが一番簡単な SqueakToys でのアニメの作り方です。ホルダや look like はいろいろと応用がきくと思います。図にもありますが、すでに Car ではないので Ant に Car モーフの名前を変えました。ビューワやスクリプトの名前も一斉に自動的に変わります。また、私の絵ではアリが巨大すぎるので、Car あらため Ant モーフのビューワの geometory カテゴリにある Ant's scaleFactor ← 1.0 の 1.0 を 0.5 などにしてアリを小さくしました。また、ホルダも邪魔なので、Ants ホルダのビューワの miscellaneous カテゴリになる Ants hide フレーズの〔!〕“一回実行”ボタンをクリックして画面から消してしまいます。--sumim - 2002-11-29, 15:38:47
look likeは,「〜に見える」の意かと思いますが,この蟻さんの絵を元のCarに戻す事は出来ないのでしょうか?いや,そもそもPlayer CursorとかCursor Increaseも判ってないですね.ところで,Ants hideフレーズで消してしまった,Antsホルダですが再表示は出来るのでしょうか?--人狼 - 2002-11-29, 15:55:40
look like や、いったん変えた絵を元に戻す…は“トラップ”がらみなのであとにしましょう。まずは、ホルダから。消したのを出すのはビューワが残っていたら簡単です。ビューワの Ants show を fire(一回実行をこう呼びます)します。--sumim - 2002-11-29, 16:17:54
>look likeや、いったん変えた絵を元に戻す…は“トラップ”がらみ
なんか,また地雷に近づいていたみたいですね(^^;ホルダのビューワ…消してしまいました.一回実行を「fire」と呼ぶのは了解です.--人狼 - 2002-11-29, 16:25:42
ビューワをすでに消してしまっている場合には、デスクトップメニューの authoring tools... から unhide hidden objects を選択します。--sumim - 2002-11-29, 16:26:32
ありがとうございます.無事にホルダが見えました.--人狼 - 2002-11-29, 16:31:59
次にホルダの使い方ですが、新しいホルダを用意して、例によって Rectangle だの RoundRect、Ellipse、Star、Polygon、Curve …などを放り込んでみてください。すると、自動的にサブモーフになると思います。ホルダはサブモーフをコンテンツとして管理する機能に特化されたモーフです。--sumim - 2002-11-29, 16:29:26
管理する…と言っても、カーソルと呼ばれるインデックスを参照/変更できるような SqueakToys インターフェイス(フレーズ)を持っていて、そのカーソルが示す場所にあるモーフも簡単に参照できる…というだけのはなしですが(^_^;)。まあ、そこいらへんは先ほどの例で見ていただいたとおりです。--sumim - 2002-11-29, 16:31:21
新しく作ったホルダの collections カテゴリパネルを呼び出して、Holder's cursor ← 1 の値を変えるとどんなことが起こるか観察するとその働きが分かると思います。--sumim - 2002-11-29, 16:35:09
>カーソルと呼ばれるインデックスを参照/変更できる
なるほど.了解しました.これが先のcursorなんちゃらですね.Ant's cursor increase by 1とした,これがホルダーのカーソルをインクリメントしてモーフ(蟻の絵)を参照しているのですね.インクリメントして,カーソルがサブモーフの数を超えたらリセットされていると言う理解で良いのでしょうか?--人狼 - 2002-11-29, 16:35:54
>Holder's cursor ← 1 の値を変える
なるほど…いや,先の質問は無かった事にしてください(汗)--人狼 - 2002-11-29, 16:37:00
そうです。越えると 1 に戻ります。同じく、decrease by として減らしても 1 より小さくなると最大値に戻ります。 嘘みたいです(^_^;)--sumim - 2002-11-29, 16:38:20
おぉぉ,おもしろい.試しに先程のアニメのincrease byをdecrease byにしたら,絵が変わらないです.Holder's cursorの▼をクリックすると,0と1を行ったり来たりしますね.確かにこれでは絵は変わらないでしょうが…0って大丈夫なんでしょうか?--人狼 - 2002-11-29, 16:39:46
そのようですね(^_^;)。小さくなるときはラップしないようです。ごめんなさい。--sumim
あとはカーソルの位置の“プレイヤ”(トラップ関連)を参照できるので、それを使って今回はアニメを作ったわけです。では、トラップのほう行きますか?--sumim - 2002-11-29, 16:40:35
了解しました.>decrease.ご確認有り難うございます.では,トラップへ(^^;--人狼 - 2002-11-29, 16:47:27
ポイントは“プレイヤ”って何さ?に気付くかどうかがトラップでした。これ、モーフじゃないんです。実は、SqueakToys はこのプレイヤというオブジェクトにメッセージを送るしくみとして実装されているんですね。--sumim - 2002-11-29, 16:49:32
プレイヤというオブジェクトはある意味、それ自体を画面で見ることはできません。まあ、モーフが特殊なだけで、オブジェクトってのはたいてい目には見えないものですが(笑)--sumim - 2002-11-29, 16:52:07
我々がスクリプトで命令を出してモーフが動くのは、モーフがメッセージを受けているわけではなく、モーフの“がわ”をかぶったプレイヤに指示していることなのです。--sumim - 2002-11-29, 16:53:48
で、あるプレイヤがどんな“がわ”(コスチュームと言います)を被ったかは履歴としてプレイヤが管理しています。ビューワのカテゴリパネル追加ボタンとビューワメニューボタンの間に知らぬ間に上下の緑の矢印が追加されているので、これをクリックすると、これまでまとったコスチュームの履歴をたどることができます。元のスケッチに戻すときは、graphics カテゴリに restoreBaseGraphic というフレーズがあるのでこれを fire します。これが「元のCarに戻す事は出来ないのでしょうか?」の答えです。--sumim - 2002-11-29, 16:57:09
プレイヤ(Player cursorのPlayer)はオブジェクトなんですね.これはSqueakToysの時だけ関係するオブジェクトと言う理解で良いのでしょうか.
>モーフの“がわ”をかぶったプレイヤ
モーフはプレイヤを継承しているのでしょうか?モーフとプレイヤの関係はIs-Aでしょうか,Has-Aでしょうか?--人狼 - 2002-11-29, 16:58:27
>あるプレイヤがどんな“がわ”(コスチュームと言います)を被ったか
との事ですので,Is-AとかHas-Aとは,また違うのかなぁ.「被る」と言う言葉から継承を想像したのですが,なんか違う感じがします.コスチュームの履歴はたどれました.順番に見て行くのですね.「最新はどれ?」って言うのが判らなくなりそうです.--人狼 - 2002-11-29, 17:12:23
モーフとプレイヤの関係は…、むずかしいっすねぇ(^_^;)。その前に、Smalltalk のオブジェクト、つまりインスタンスの特徴について触れておきましょう。オブジェクトの実装方法には大きく分けて2種類あります。ひとつは Smalltalk タイプのインスタンス型。いわゆるクラスベース・オブジェクトです。もうひとつは Self に代表されるフレーム型。いわゆるプロトタイプベース・オブジェクトです。インスタンスはクラスにその仕様の記述場所を求めます。本人は、数の決められたインスタンス変数にどんなオブジェクトを束縛しているかについての情報しか持ち合わせません。対して、フレームはインスタンスにおけるクラス的な存在を必要とせず、変数の数も自分自身で決められ、メソッドも自分自身で管理することができます。ちなみに継承は特殊なスロット(他のフレームを参照するのに用いたり、メソッドを格納するための引き出しのようなもの)に別のフレームを参照する(そうして参照されたフレームを特にプロトタイプと呼ぶ)ことで行なわれます。--sumim - 2002-11-29, 17:15:26
うぐっ.また地雷を踏んだかな?(汗)オブジェクト→インスタンス型とフレーム型.インスタンス型はクラスによる仕様が必要で,フレーム型は自分で管理しているんですね.フレーム型の継承はスロットで別のフレームを参照する事で…と.参照されているフレームを「原形」として継承するので,プロトタイプと呼ぶのかな.インスタンス型の継承はクラス定義でスーパークラスを規定する事でなされるんでしょうね.--人狼 - 2002-11-29, 17:21:45
Moprhic の特に SqueakToys で扱うオブジェクトには実装上、フレーム的性格が要求されます。即ち、我々は描いた絵、それぞれに好きなスクリプトを組みたいと思うわけですが、その絵がインスタンスでは、自由な変数(まだ触れていません)を持たせることや、スクリプトを自在に追加することができないからです。また、見えている絵の“クラス”というものを意識してスクリプトを記述する必要がでてきてしまいます。余談ですが、こうした煩雑さを避けるという目的、つまり Smalltalk のアンチテーゼとして登場したのが Self です。--sumim - 2002-11-29, 17:23:24
いっても Smalltalk のオブジェクトであるインスタンスは、どうあがいてもフレームにはなれないので(クラス-インスタンスというフレームワークごと変えることも Smalltalk なら可能といえば可能ですが…そのときにはすでにそれは“Smalltalk”ではなくなってしまうので(^_^;))、苦肉の策として登場したのが「プレイヤ」というオブジェクトです。プレイヤは、モーフというインスタンスに欠けている自由なスロットを持つこと(つまり独自の変数やメソッドを持つこと)を補う役割りを果たします。--sumim - 2002-11-29, 17:29:09
ちなみに Morphic フレームワークは、当初 Self で構築されたものを Squeak/Smalltalk-80 へ移植したものです。Self 版の Morphic も健在です。--sumim - 2002-11-29, 17:30:53
う〜ん.フレーム的性格と言うのは上述の変数やメソッドを自分で管理する…と言う事なのでしょう…そもそも「自分で管理」と言うところがピンと来ていないので,今はまだ,理解できてないです.すみません.--人狼 - 2002-11-29, 17:41:48
インスタンスとフレームは,考え方(と言うか思想…と言うか概念)がそもそも違いそうですから,インスタンスがフレームになる,またはその逆と言うのはダメですよね.おっしゃる通り,フレームワークを変える事は出来たとしても,その時点でインスタンスと言う考え方自体が意味を持たなくなりますよね…プレイヤがモーフと言うインスタンスに欠けている自由なスロット(この自由と言うのがキーワードっぽいですね)を持つことを補う…これも,今は理解出来ていません.--人狼 - 2002-11-29, 17:46:27
「管理」というと語弊がありますので、インスタンスはクラス定義に忠実でなければならないため、独自の変数やメソッドを持てない…が、SqueakToys で我々が描いた絵に求めるのはそうしたインスタンスではなしえない能力だ、というのではいかがでしょう。--sumim - 2002-11-29, 17:45:11
その説明だと少しすっきりします.SqueakToysで我々が描いた絵に求めるのは「独自の変数やメソッドを持つ事」である.我々が描いた絵はモーフ(インスタンス)である.インスタンスには「独自…」と言う能力は無い.なので,その能力を補う為にプレイヤがある.--人狼 - 2002-11-29, 17:49:54
ところが、プレイヤだってオブジェクト、つまりインスタンスですから独自のメソッドなんか持てやしない…(笑)。そこで、Squeak ではちょっと大胆なことをしてインスタンスに独自のメソッドを持たせることを試みたわけです。その方法は、モーフ(すなわちインスタンス)ひとつひとつにクラスをひとつずつ割り振ったのですね。つまり絵をひとつ描く(SketchMorph のインスタンスを作る)たびに第三者的立場のクラスがひとつできるわけです。おおざっぱにいうとこれがプレイヤというオブジェクトの正体です。--sumim - 2002-11-29, 17:53:13
え?いや,ちょっと待ってください.落ち着いて考えさせてください(汗)--人狼 - 2002-11-29, 17:59:05
じゃあ、まあ今夜はこの辺で(笑)。ネコちゃんといっしょにじっくり考えてみてください(笑)。もちろんトラップ付きです(^_^;)。--sumim - 2002-11-29, 18:00:24
>モーフ(すなわちインスタンス)ひとつひとつにクラスをひとつずつ割り振った
>第三者的立場のクラスがひとつできる
と言う事なので,SketchMorphのインスタンスを作るたびに,第三者的立場のクラスをひとつ割り振る…と言う事ですよね.でも,クラスですよね.インスタンスじゃなくて.誰がクラスの設計を?そもそも,クラスは仕様(と,言うか設計書のはず)ですから,インスタンスとは違いそれ自体がメッセージを受けたり何かしたり…と言うのはありなのかな?(クラス:設計書,インスタンス:実体)それにクラスであれば自由に云々はやはり出来なさそうな気がするんですが(^^;
>プレイヤというオブジェクトの正体
いやいや,オブジェクトですよね.クラスもオブジェクトなのかな?う〜ん,なんか深みに…--人狼 - 2002-11-30, 12:07:55
>プレイヤだってオブジェクト、つまりインスタンス
と書いてりました.プレイヤはインスタンスと,言う事で上記の質問中「クラスであって,インスタンスではない」と言う誤解に基づく質問は無かった事にして下さい.それにしても,う〜ん…ますます謎.プレイヤーがインスタンス→プレイヤーはクラス・ベース・オブジェクト→クラスに基づくオブジェクト.つまり,やはり「クラス(仕様)はどうなっていて誰が作っているの?」と言う疑問は残る…と.それに「クラス・ベース」なら,やはり自由に変数やメソッドを…って言うのは実現出来ないような気がします.仮にプレイヤーがラッパークラスだとしてもやはり謎.悔しいのですが,モーフ(インスタンス)をプレイヤ(インスタンス)でくるんだとしても,やはり自由からはほど遠い印象しか持ち得ません.--人狼 - 2002-11-30, 12:50:51
まず「クラス(仕様)はどうなっていて誰が作っているの?」ですが、Player というスーパークラスにプレイヤの基本的な仕様を仕込んでおきます。各プレイヤ用にはそのサブクラスとして PlayerXXX という名前のクラスをその都度、作っています。我々がプレイヤに変数(ビューワでいうところの instance variable )やメソッド(タイルスクリプト)を追加すると PlayerXXX にそうした仕様が付け加えられてゆきます。--sumim - 2002-11-30, 14:42:37
たとえば Car 改め、Ant の場合、そのビューワのシフトビューワメニューから、inspect player を選び、その self をクリックして選択、もしくはどこかに self とタイプして選択後 browse-it (cmd-b) すると、そのクラス定義をブラウズすることができます。クラスは Player のサブクラスで、我々がタイルスクリプトとして作成したメソッドが追加されているのがわかります。また、ビューワメニューから add a new instance variable を選んで適当な名前を付けて(デフォルトのままでもよい)accept すると、ブラウザのクラス定義も変化するのを見ることができます。--sumim - 2002-11-30, 14:49:05
図で、rounding とあるのがタイルスクリプトを Smalltalk コードに“コンパイル”してプレイヤに定義されたメソッドです。(ブラウザを呼び出した直後や instance ボタンをクリックしたときに)コードペインに instanceVariableNames: 'cargo ' とあるのや、メッセージペインに getCargo、setCargo: とあるのは、ビューワメニューから add a instance variable を選択してデフォルトの cargo という名前でインスタンス変数を作る作業をした後、追加されたものです。--sumim - 2002-11-30, 14:57:43
「誰が作るのか」には答えることができていませんが、インスタンス(モーフ)に第三者的クラス( Player のサブクラスの PlayerXXX )を対応づけることで独自の変数やメソッドを持たせることが可能であろうなぁ…という印象は持っていただけたと思います。ただ、プレイヤはオブジェクト、つまりインスタンスなのでクラスだけ作ってもしかたありません、実際には、この PlayerXXX の唯一のインスタンスが作られ、それがプレイヤ自身ということになります。--sumim - 2002-11-30, 15:03:05
お休みの日に有り難うございます.無理,なさらないで下さいね.さて…
Playerと言うスーパークラスがある.モーフを作る時に,都度PlayerのサブクラスであるPlayerXXXが作られる.そしてPlayerXXXの唯一のインスタンスが作られ,これがプレイヤである.と言う事ですね.「誰が作るのか」は確かにまだ判りませんが,今はそれほど重要ではないような気がします.プレイヤと言う物が,モーフにスクリプトを後で追加出来る仕掛けだ,と.そこが大事なのかな.
自由にスロットを持てるような仕掛けが元々Playerなるスーパークラスに存在していると言う事なのかな?
ご存知の通り(苦笑)深く追及・考察していくのは好きなのですが,時期尚早な場合は止めて下さいね.
ブラウザでの確認も出来ました.--人狼 - 2002-11-30, 15:49:14
いえいえ人狼さんこそ、お休みの日にありがとうございます。
>,今はそれほど重要ではないような気が
ふっふっふ(笑)。
では、まあ、あまり脱線してもいけませんのでコスチュームくらいまで話を戻しましょうか。プレイヤはモーフと同時に作られて、そのモーフをコスチュームとしてまといます。モーフはプレイヤというパートナーを得ることによって独自の変数やメソッドを必要に応じて得ることができる…というくだりでした。こうなると、プレイヤとモーフは一心同体、一蓮托生、運命共同体かと思われますが、実は違います。(違うんかいっ(笑)) いってみれば“モーフの力を借りて”この世に意味を持って生まれてくることができたプレイヤでしたが、必要とあらば、文字通り洋服を着替えるかのように簡単にコスチュームであるそのモーフを取り替えることができます。その機能の担うのが look like フレーズです。このフレーズを使うことで、プレイヤは他のプレイヤがまとっているコスチュームであるモーフを拝借できます。元のスケッチに戻す方法ですが、graphics カテゴリに restoreBaseGraphic というフレーズがあるのでこれをつかいます。さらに、元のコスチュームは履歴として残されるようになっていて、必要ならいつでも元の途中のコスチュームに戻すこともできる。これがビューワのコスチューム履歴呼び出し矢印だという話でした。以上、さらってみましたがいかがでしょうか。--sumim - 2002-11-30, 16:11:54
>いえいえ人狼さんこそ、お休みの日にありがとうございます。
とんでもないです.私は生徒ですから(汗)
>ふっふっふ(笑)。
あ,なんか,こわ.いや〜な予感(汗)
さてさて,コスチュームですね.確かに,プレイヤの作られる経緯を考えると一心同体っぽく見えますが…look likeフレーズで他のプレイヤのコスチュームであるモーフを拝借出来る.う〜ん…実はモーフではなくてプレイヤが主人公のような気がしてきました.
あ!先の例だとCarと言うスケッチモーフがあって,そのプレイヤに対してlook likeでAntと言うスケッチモーフをかぶせたわけですよね.(正確にはホルダモーフのカーソルの指し示すサブモーフ(のプレイヤのコスチューム)の…となるのでしょうが,簡単のためにAntと考えさせてください.)と,なるとAntと言うスケッチモーフは,それが作られた時には一緒に作られたプレイヤにかぶられていたわけですが,look likeによって,Carと一緒に作られたプレイヤにかぶられたわけですよね.この時,Antと言うコスチュームはAntと一緒に作られたプレイヤとCarと一緒に作られたプレイヤの両方からかぶられているんですよね…で,Carそのものは…裸(ちょっと違う?)ですか?--人狼 - 2002-11-30, 16:50:15 赤字はsumim追記
>Carそのものは…裸(ちょっと違う?)ですか?
今まで我々が“モーフ”だと言っていた状態でデスクトップに現れたとき はじめてモーフの(プレイヤの)ビューワを表示させたとき、そのモーフにプレイヤが付(き、やがて場合によってはそのモーフから主役の座を奪う(笑))くので、今の段階では“裸”と考えていただいてかまわないと思います。細かいことを申し上げると、Car や Ant というのはプレイヤあっての名前なので、裸になるとただの SketchMorph クラスに属するいちインスタンスということになり名前はなくなります。車を描いたスケッチモーフ、蟻を描いたスケッチモーフ…というほうがよいかもです。余談ですが、インスタンスは明示的に変数で束縛しない限り、たいてい“名前”というものはありません。--sumim - 2002-11-30, 17:02:09
>今の段階では“裸”と考えていただいてかまわない
了解しました.とりあえず,そう理解しておきます.「今の段階では」と言う事は,追々真実が明らかになるのでしょう.
>Car や Ant というのはプレイヤあっての名前
なんて聞くと,ますますもって「プレイヤこそ主役」と言う感じがしてきます(汗)
>インスタンスは明示的に変数で束縛しない限り、たいてい“名前”というものはありません
これはプレイヤなるインスタンスが明示的にSketchMorphクラスのインスタンスを変数で束縛していると言う事ですね.
まだ理解した,とは言えませんが,前よりは霧(なり靄)なりが薄くなったかもしれません.--人狼 - 2002-11-30, 18:44:19
プレイヤとモーフの主客が逆転するのはいつか…というのは興味深い題材ですね。こんど機会があったらじっくり調べてみましょう。では、コスチュームはこのくらいにして…。ここまでは、コスチュームを切り替えることでアニメーションができる。そのとき、ホルダモーフのサブモーフを流用すればよい…ということでした。これで本流に復帰ですね(笑)。--sumim
このページを編集 (41352 bytes)
|
以下の 1 ページから参照されています。 |
This page has been visited 3576 times.