有効範囲の変化

ややこしい有効範囲

 スクリプトオブジェクト間の変数や属性の有効範囲(スコープ)はかなりややこしく、そのあたりを考えると、変数使うより外部に設定ファイルを作った方が幾らか楽でさえもあったりします。
 まず、局所変数の場合は全く問題ないのですが、大域変数や属性が絡むとかなり複雑です。さらには、スクリプトオブジェクトの読み込みで、有効範囲のややこしさは加速度を増します。詳しくは「大域変数の有効範囲」を参照して下さい。

属性は順番が大事

 スクリプトオブジェクトでは、スクリプトに書く順番が非常に重要になります。
 ほとんどバグだと思うのですが、構文解釈の仕様として、以下のようなものがあります。

script X
	display dialog a
end script

property a : "Script me"

run X

と書くとエラーになり、

property a : "Script me"

run X

script X
	display dialog a
end script

と書くとエラーになりません。
 このように、構文確認の高速化のためか、構文確認の方法と属性の管理が結構大雑把なようです。スクリプトの順番に気を付けましょう。

大域変数でも順番が大事

 属性で無くて大域変数でも同様です。

script X
	display dialog a
end script

global a

set a to "Script me"
run X

は、ちゃんとエラーになるのだけど、次のはエラーにならないのです。

global a

set a to "Script me"
run X

script X
	display dialog a
end script

 次のようにglobal宣言だけ前にもってきても、エラーになりません。

global a

script X
	display dialog a
end script

set a to "Script me"
run X

 要するに、スクリプトオブジェクトはスクリプトの最初で定義して、global宣言はスクリプトオブジェクトの定義の後かハンドラの中でやるのが鉄則って事になります。
 そうしておかないと、知らないうちに変数が衝突してしまうので面倒です。
 さらに予防策として、大域変数の頭にはg_、属性の頭にはp_と付けるなどして、局所変数と間違えないようにするのも手です。
 参照渡しなどを使い、できるかぎり大域変数は使わない、属性も最小限にとどめるということも大切です。


2000-06-30 -2001-01-13