[Squeak-ja: 3269] Re: squeak 初心者の質問:モーフの指定

Tetsuya HAYASHI tetha @ st.rim.or.jp
2006年 12月 7日 (木) 18:53:13 JST


井上さん、こんばんは。
林です。

On 2006/12/07, at 11:09, iNOUE Koich! wrote:

> ワールドに出した場合、他のものはゴミ箱行きにならないのですが、星と曲線
> と多角形は何度やってもゴミ箱直行です。たまにゴミ箱の中からも消えている
> ことがあります。

 バージョンが古いと、強制的にゴミ箱に行ってしまうことがあるようです。
 ワールドメニューの「ヘルプ...」から「サーバーからアップデートを取得」で
パッチをあてた場合、どうでしょう?

> これは変数名だったのですね。もう少し初心者の質問をよろしいでしょうか。
> 変数というものはオブジェクトではない、squeakプログラムの構成要素の一つ
> だと認識しているのですが、そこに代入されるオブジェクトそのものを直接に
> 指定する(リテラルとして)ことはできないのでしょうか。普通の数だとか文
> 字列だとか配列だとかにはリテラル表現がありますが、もしかしてシンボルと
> いうものがそれなのでしょうか?
> a星811が星のモーフを代入した変数名だとすると、Workspaceがモーフのドロ
> ップを受けたときにそれを自動生成してくれたということですよね?この手段
> 以外で星のモーフをプログラム内で指定することはできるのだろうかというの
> が質問の趣旨です。

 私よりも旨く正確に説明出来る方がほかにいらっしゃると思いますが(^^;;

 結論としては、リテラルのように指定する方法は残念ながら無いと思います。
(言語仕様を拡張して、分散オブジェクトのIDみたいなものを導入すれば出来る
のかもしれませんが、結構負担も大きそうです)

 ワールドの中からモーフを探し出す方法としては、モーフは、Morphic のフレ
ームワークで実現されてますので、その仕組みを利用します。
例えばモーフ/サブモーフの関係とモーフの持つ名前を利用して検索する方法が
あるかと思います(ここでいう名前は普段ハロなどで表示されているモーフの名前
です)。
	star := ActiveWorld submorphNamed: '星'
とかです。
# もっといいやり方もありそうですが…ほかの方お願いします。
# これって結構、私も悩むところだったりします(^^;;


> それから、ActiveWorldやSmalltalkはグローバル変数だそうですが、
> Transcriptもそうなのでしょうか。trueやfalseやnilは変数じゃなくてオブジ
> ェクトそのものなのですよね?

Transcript もグローバル変数です。
選択してインスペクトするとオブジェクトがバインドされてるか分かります。

true や false や nil についてですけど、変数というものが中身が入れ替え
可能なものという定義であるならば、変数ではないということになるかと思います。
書き換えができませんので。
でも、それぞれインスペクトするとオブジェクトを見ることができます。

 個人的には、乱暴な言い方をしますと上記のtrueや偽変数や変数、それにクラ
ス名など全部ひっくるめて「変数のようなもの」(オブジェクトがぶら下がって
いるもの=ひもつきのラベル)と捉えてます。

こう見ると、Smalltalkの構文は
    「変数のようなもの(オブジェクトがぶら下がってる)」+「メッセージ」 
とシンプルになります。
逆にメッセージ以外はすべて「変数のようなもの」ということでもいいのかもし
れません(実際はリテラルがありますが限定されてますし)。

例えば、クラス名もグローバル変数だったりします。

> いろいろありました。ありがとうございます。googleのトップに出てきたペー
> ジではグローバル変数の一種と書かれていましたが、Workspaceのインスタン
> ス変数であると書かれているページもありちょっと混乱します。もしかして、
> プログラムの中で使う変数というものはどれも何らかのオブジェクトのインス
> タンス変数になるのでしょうか?

Workspace のインスタンス変数というのは、おそらくクラスWorkspace に
定義された bindings のことだと思います。これは『ワークスペース変数の
仕組み』を実現しているものです。このインスタンス変数には連想配列のオブジ
ェクト(Dictionary)がぶら下がってます。
ワークスペースで式を実行すると、式の中で出現したワークスペース変数名を
キー(添字)にして、そのワークスペース変数に代入(バインド)されたオブ
ジェクトが、この連想配列に登録されていきます。

	キー		値
	#a星2142   -> {星のオブジェクト}
	#a四角形233  -> {四角形のオブジェクト}
	#a楕円1482  -> {楕円のオブジェクト}
	...

という感じです。
次の実行時には、式の中の変数名でこの連想配列を辞書引きして、その連想値で
あるオブジェクトに置き換えてるということですね。こうすると変数として機能
する見えるという仕掛けです。
また、bindings は Workspace のインスタンス変数なので、一枚一枚のワークス
ペース(Workspaceのインスタンス)ごとに別なオブジェクトになりますので、必
然的にスコープはワークスペースごととなります。ですのでグローバル変数ほど
スコープは広くはないです。

Smalltalk はそれ自身で言語が実装されてますので、変数の内、グローバル変数
なども同じように連想配列オブジェクト(辞書)を使って実現してたりします。
この辺りの実現方式の話が言語仕様と絡むとわやくちゃになってしまうのですが。
(ブートストラップといいましょうか、メビウスの輪といいましょうか)

> このML以外に初心者質問用の場所がないようでしたら、今後もちょびちょび質
> 問させていただこうと思いますのでよろしくお願いします。

こちらこそよろしくお願いします。
他の言語系のMLに比べればまだまだおとなしめかと思いますし…。

--
林 徹也 Tetsuya HAYASHI 
tetha @ st.rim.or.jp, tetha @ mac.com





Squeak-ja メーリングリストの案内