グローバル変数、ローカル変数
HyperTalk では普通の変数はハンドラ内で宣言なしで使えました。例えば
on mouseUp put "Hellow" into abc put abc end mouseUpというスクリプトでは、変数 abc は mouseUp ハンドラ内だけで有効です。他のハンドラで変数 abc を使った場合は、「名前は同じだけど全く別の変数」として扱われます。この変数はハンドラを終了すると完全に消えて無くなります。
on mouseEnter global abc put "Hellow" into abc end mouseEnter on mouseUp global abc put abc end mouseUpこの2つのハンドラで使われている abc は完全に同一の変数です。グローバル変数は HyperCard を終了するまで有効で、HyperCard を終了すると完全に消えて無くなります。
global abc on mouseEnter put "Hellow" into abc end mouseEnter on mouseUp put abc end mouseUpこの2つのハンドラで使われている abc は、完全に同一の変数です。スクリプトの先頭で1回宣言するだけで、そのオブジェクト内の全てのハンドラに適用されます。ハンドラ内でいちいち宣言する面倒が無い代わりに、この宣言のあるオブジェクト内では、同じ名前の「普通の変数」が使えなくなります。
local abc on mouseEnter put "Hellow" into abc end mouseEnter on mouseUp put abc end mouseUpこの2つのハンドラで使われている abc は、完全に同一の変数です。ローカル変数を使うには local 宣言が必要です。
on mouseEnter local abc put "Hellow" into abc end mouseEnter on mouseUp local abc put abc end mouseUpこの2つのハンドラで使われている abc は、全く別の変数です。普通の変数と違うのは、中身が empty に初期化されることです。このスクリプトを実行するとメッセージボックスには empty が入りますが、local 宣言をしていなかった場合はメッセージボックスに "abc" が入ります。
local abc = "Hellow"
on mouseUp put 1 into a put 2 into b put tasu( a, b ) into kotae end mouoseUp function tasu x, y return x + y end tasutasu関数のxとyには、aの内容とbの内容がそれぞれ「コピー」されます。aとx、bとyは値は同じですが、当然ながら全く別の変数です。
on mouseUp tasu a, b, kotae end mouoseUp on tasu x, y, @z put x + y into z end tasu@zという見慣れない表記の引数が現れ、functionではなくonハンドラになりました。tasuハンドラのxはaのコピー、yはbのコピーですが、zはmouseUpハンドラのkotaeと「完全に同一の変数」です。呼び名は違ってもメモリ上の全く同じ変数領域を使います。そのためtasuハンドラでzに書き込んだ値は、mouseUpハンドラのkotaeに反映されます。
on mouseUp get keisan( a, b, tashita, hiita, kaketa, watta ) end mouoseUp function keisan x, y, @added, @subtracted, @multied, @dived if ( y = 0 ) then return false put x + y into added put x - y into subtracted put x * y into multied put x / y into dived return true end keisanほら、一気に4つの値を得ることが出来ました。このように複数の返値が欲しいときは、参照渡しは絶大な威力を発揮します。ここでは関数形式にして、もしyが0だったら何もせずにfalseを返す、正しく計算が行われたらtrueを返す、というルーチンにしました。計算の正否を関数の返値として返し、計算の結果は変数に直接返すというわけです。