AppleScriptはオブジェクト指向の御多分にもれず、イベント駆動(event driven)型の言語ですから、メッセージがハンドラに送られて、ハンドラに記述されている処理が実行されます。
同じメッセージを受け取るハンドラが、複数のオブジェクトに用意されている場合、実行されるハンドラの優先順位が決まっていないと、スムーズに実行できません。
で、このお伺いをたてる道順をメッセージの経路(path)とも言います。
利用者定義命令も、履歴ウィンドウには表示されませんが、基本的にはメッセージを発信して、それをハンドラが受け取って実行していると考えられます。
さて、次のスクリプトを見て下さい。
beep
on beep
end beep
beep命令が書かれていますが、実行してみると何もおきません。
これは、beepハンドラを置く事で、メッセージを横取りしているために起こります。
OSAXよりもスクリプトのハンドラの方が優先順位が高いので、メッセージがbeep命令より先にbeepハンドラに届いているのです。
メッセージを横取りしたハンドラの方にcontinue beepと書いて、メッセージを先に送るようにすれば、ちやんとbeep命令が実行されます。
beep
on beep
continue beep
end beep
この仕組みを使えば、手軽にOSAX命令を拡張する事もできます。
continue する前後に処理を追加しておけばいい訳です。
もちろん、continueしなければ、全く別の処理を行うこともできます。
次の
beep
on beep
display dialog "ビープ" buttons {"OK"}
continue beep
end beep
AppleScript命令はメッセージが発生せず、いきなり実行されるので高速です。ハンドラを利用して乗っ取る事もできません。
また、アプリケーション命令はメッセージの送り先がハッキリしていないと実行されないので、通常は乗っ取る事はできません。ただし、parentとして設定している場合は乗っ取ることができます。
親(parent)のスクリプトオブジェクトの利用者定義命令は乗っ取れます。特に、親のオブジェクトの定義を重ねることを、オブジェクト指向の用語ではオーバーライド(override:優先)と言います。単なるウンチクですから、覚える必要は無いですが。
このあたりのことは、別Tipで書くかもしれません。