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