用語の衝突

用語の衝突とは

 AppleScriptの用語がOSAX同士や、アプリケーションとOSAX、さらに同じアプリケーションの中でも重複していると用語が衝突(conflict)して、動作に異常がでることがあります。
 これを、用語の衝突といいます。

属性と定数の衝突

 次のスクリプトはエラーとなって動作しません。

tell application "Finder"
	view of window 1 = icon
end tell

 というのもviewの返り値である定数「icon」が、itemオブジェクトの属性「icon」と衝突しているんで、構文確認で間違えてしまうという問題がおきているのです。
 しょうがないので、ぶつからないように生データの形で定数「icon」を書きます。  "《"はOpt+\(またはOpt+])、"》"はOpt+Sft+\(またはOpt+Sft+])で、入力できます(キー配列で異なる)
 詳しくは「《》(未定義)」を参照して下さい。
 iconの場合、生データでは次のように書けます。

《constant consiimg》

 このままFinderのtellブロックに書くと、最初は変換されて上手く働くんですが、 もう一度コンパイルすると、またエラーとなってしまいます。そこで、tellブロックの外で変数に代入しておいて、それを定数「icon」の代わりに使うことで問題が解決しま す。

set consIcon to 《constant consiimg》
tell application "Finder" to view of front window is consIcon

 同じアプリケーションの中の用語は、完全にアプリケーションの作者がコントロールできるので、衝突は起きないはずなのですが、Apple自ら別の種類の用語に同じ名前を割り当ててしまい、結果このようなバグを発生させています。
 なんとも間抜けなミスと言えるでしょう。

アプリケーション用語との衝突

 標準のOSAXとアプリケーションの用語がぶつかることは、無さそうで結構あったりします、しかもAppleの純正のHyperCardであるとか、順純正のFileMakerなんかでおきたりしているのが大笑いです。
 Appleさんてば、無計画。
 このような場合、tellでFinderあたりをターゲットにして、メッセージの経路から該当アプリケーションを追い出します。
 例えば、HyperCardのwrite命令と標準機能追加OSAXのwrite命令が衝突してしまうので、そういう場合にOSAXの命令を使いたいなら、tell application "Finder"ブロックの中に書けばいいわけです。

tell application "Finder"
	-- ここにOSAX命令を書く
end tell

 tellをするアプリケーションは別にFinderで無くてもいいのですが、「既に立ち上がっている」「全てのMac OSに存在している」という理由から、指定するのに丁度いいのです。
 もう一つは、メッセージの経路を変えるという意味では同じですが、親オブジェクトを別のアプリケーションにするという手もあります。
 次のようなスクリプトを書いておけば、その後はFinderに向けてメッセージが流れていくようになります。

property parent : application "Finder"

OSAX用語との衝突

 OSAXどうしの用語の衝突、これが一番おきやすい衝突です。
 命令の名前に2バイトの識別記号を頭に付けて、用語の衝突が起きないように工夫しているOSAXも多くあります。例えばTanaka's osaxならばMT、Dialog DirectorならばDDといった具合です。
 特に、Akua Sweets等の用語の多いOSAXを入れると発生率が高まります。
 回避するには、衝突しているOSAXを一時「スクリプティング機能追加」フォルダから取り除くしかありません。

 使っていないOSAXは取り除くというのが、地味ですが、用語の衝突を防ぐには有効な方法だと言えます。


2001-09-01