グローバル変数、ローカル変数
HyperTalk では普通の変数はハンドラ内で宣言なしで使えました。例えば
on mouseUp put "Hello" into tAbc put tAbc end mouseUpというスクリプトでは、変数 tAbc は mouseUp ハンドラ内だけで有効です。他のハンドラで変数 abc を使った場合は、「名前は同じだけど全く別の変数」として扱われます。この変数はハンドラを終了すると完全に消えて無くなります。
on mouseEnter global gAbc put "Hello" into gAbc end mouseEnter on mouseUp global gAbc put gAbc end mouseUpこの2つのハンドラで使われている gAbc は完全に同一の変数です。グローバル変数は HyperCard を終了するまで有効で、HyperCard を終了すると完全に消えて無くなります。
global gAbc on mouseEnter put "Hello" into gAbc end mouseEnter on mouseUp put gAbc end mouseUpこの2つのハンドラで使われている gAbc は、完全に同一の変数です。スクリプトの先頭で1回宣言するだけで、そのオブジェクト内の全てのハンドラに適用されます。ハンドラ内でいちいち宣言する面倒が無い代わりに、この宣言のあるオブジェクト内では、同じ名前の「普通の変数」が使えなくなります。
local sAbc on mouseEnter put "Hello" into sAbc end mouseEnter on mouseUp put sAbc end mouseUpこの2つのハンドラで使われている sAbc は、完全に同一の変数です。ローカル変数を使うには local 宣言が必要です。
on mouseEnter local tAbc put "Hello" into tAbc end mouseEnter on mouseUp local tAbc put tAbc end mouseUpこの2つのハンドラで使われている tAbc は、全く別の変数です。普通の(宣言無しで使われる)変数と違うのは、中身が empty に初期化されることです。このスクリプトを実行するとメッセージボックスには empty が入りますが、local 宣言をしていなかった場合はメッセージボックスに "tAbc" が入ります。
local tAbc = "Hello"
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 put 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 ) put tashita && hiita && kaketa && watta end mouoseUp function keisan pX, pY, @rAdded, @rSubtracted, @rMultied, @rDived if ( pY = 0 ) then return false put pX + pY into rAdded put pX - pY into rSubtracted put pX * pY into rMultied put pX / pY into rDived return true end keisan一気に4つの値を得ることが出来ました。このように複数の返値が欲しいときは、参照渡しは絶大な威力を発揮します。ここでは関数形式にして、もしyが0だったら何もせずにfalseを返し、正しく計算が行われたらtrueを返す、というルーチンにしました。計算の正否を関数の返値として返し、計算の結果は変数に直接返すというわけです。