2008/9/14 (日)
ESTKと他の言語のundefined
ESTKを常用していると、たまに他の言語の作法が面倒になる事があります。例として比べやすいのが、「undefined」等の使い方です。
例えば、AppleScriptで以下のスクリプトを実行すると、エラーとなります。
set x to 0
if x > 1 then set w to 1
if w then display dialog w
何故かと言うと、変数「w」が定義(宣言)されないと、その次に続く行で支障がでる為です。加えて、if分岐の条件に適合し変数「w」が設定されたとしても、変数「w」は「真偽値/boolean」では無いため、「if w then」なんて言う書き方では支障がでます。期待する動作を実現するには、(例えば)以下の様に書きます。
set x to 0
set w to 0
if x > 1 then set w to 1
try
display dialog w
end
しかし、ESTK(=JavaScriptの拡張言語)だと「undefined、null、false、0 以外はtrue」と言う構造のため、変数の宣言や真偽値を導く演算をしなくても、エラーにはなりません。
var x=0;
if(x>1){var w=1;}
if(w){alert(w);}
これは非常にらくちんな仕様です。構造を把握していれば、文を簡潔にまとめられます。
‥‥しかし、困った事も発生します。特に困るが「変数の寿命」です。例えば、AppleScriptなどの他言語では実行ごとに変数は宣言も含めて初期化される仕様が多いのですが、ESTKですと変数はそのまま生き続けて、以下のような状態が成立してしまいます。
下図のスクリプトを実行します。
その次に、全ての文面を消去します。
下図のスクリプトを書き込みます
スクリプトを実行すると、あれまあ、文面には存在しない変数「x」が表示されちゃいました
実際に私はこの仕様に気付くまで、何度も混乱しました。一度実行した変数は、その後にスクリプトを書き直して文面から消滅しても、「裏」では生きている訳です。
ですから、if分岐で条件に適合した時だけ宣言がおこなわれる変数は、非常に危うい構造と言えます。今回のESTK例文も「NG」。変数そのもののundefinedを期待しても、前回実行時に変数が宣言されてしまった場合は、undefinedにはならないからです。
でもまあ、こうした特性をふまえて活用すれば、ESTKはフットワークの軽い快適な開発環境です。
あとは、インターフェイスビルダー的なものが付属してくれると、すごく助かるんですがネ‥‥。実際、ESTKのスクリプト文だけでGUIを組むのは、時間の浪費が激しく、「XcodeのAppleScriptをブリッジにして、Interface Builderで組めばいいか」と早々に投げ出したくなります。‥‥かといって、AppleScriptをブリッジにするのも面倒なんだよなぁ‥‥。
作成者
ezura






