利用者(user)が、独自に命令を設定して使用したい場合に使う。
頻繁に使われる文の固まりを、この利用者定義命令として定義しておくことにより、スクリプトを短く、分かりやすくできる。また、script構文内で定義することで、スクリプトオブジェクトがメッセージに応答できるようにする。
利用者定義ハンドラは、値の渡し方によって位置渡し、ラベル渡し、Objective-C形式の三つがある。
値は複製されてから渡されるので、ハンドラ内で変更しても、呼び出し元の値は変化しない。複製せず値を渡したい場合は、 a reference toを使い参照渡しをする。ただし、リスト、レコード、スクリプトオブジェクト、ハンドラ、日付は参照渡しを行なうので、ハンドラで変更された場合元の値も変更される。
結果(result)を返したい場合は、return命令を使う。returnが実行された時点で命令は終了し、on〜endブロックを脱出する。
tell構文のブロック内から呼び出す場合は、me(my)システム変数を使って、自分自身にきちんとメッセージを送る必要がある。(例1を参照)
利用者定義命令の定義と同時にhandler値が代入された変数が定義されている。
set 識別子 to «handler 識別子»
という処理がハンドラの定義と同時に行われていると考えると分かりやすいかもしれない。この変数の範囲は、定義されたスクリプトオブジェクト内である。
このようにハンドラはhandler値に定義されており、エイリアスのような感覚で変数に代入し利用することができる。これによって柔軟なスクリプトが可能になるので、覚えておいて損は無い(例2を参照)
ハンドラ内から自分自身を呼び出すこともでき、これを再帰呼び出しという(例3を参照)
Mac OS X10.10から、仮引数にasをつけてas クラス識別子 | クラス識別子のリスト
というように書き、値を受け取る際に強制変換(キャスト)を行うように指定できる(用例4)
tell application "Finder"
my dispX to "こんにちは私"
end tell
on dispX to someWords
display dialog someWords
end dispX
set x to item ((random number 2) + 1) of {a, b, c}
display dialog x()
on a()
return "aなのです"
end a
on b()
return "bである"
end b
on c()
return "cでございます"
end c
sumAll(5)
on sumAll(x)
if x < 2 then
return x
else
return x + sumAll(x - 1)
end if
end sumAll
on sample(arg as string)
end sample