その他のスクリプトとハンドラの実行
別のスクリプトを実行する最も簡単な方法は、必要なパラメータと一緒に、そのスクリプトの名前をコマンドとして使用することです。例えば、以下のコマンドにより、tellMeMoreスクリプトが実行されます。
tellMeMore 1,2,3
スクリプト内の特定のハンドラは、スクリプト名の後にドットまたはアポストロフィーS、その後にハンドラ名、そして最後にパラメータを使用して実行できます。
tellMeMore's elucidation "terse",5
utilities.insertCommas @myNumber,3
より複雑な状況では、以下のコマンドと関数が役に立つ場合があります。
runコマンド
挙動:scriptNameスクリプトまたはそのスクリプトのhandlerNameハンドラをコマンドとして呼び出します。HandlerNameは通常、引用符なしのシンプルなハンドラ名ですが、実行時にハンドラ名を構築するために、引用符付きのリテラルまたは丸括弧内の式として与えられる場合もあります。
runコマンドは、フルパス名が必要な場合やスクリプト名にスペースやその他の特殊文字が含まれる場合、または実行するスクリプトの名前が変数に含まれている場合など、上述したシンプルなコマンドが機能しないときに指定されたスクリプトを実行するのに利用できます。以下のコマンドは、スクリプトのinitialハンドラを実行します。
run "/tmp/testScript.st"
パラメータは、以下のように渡すことができます。
run "common/startup" 1200,true,"salvador"
スクリプトのinitialハンドラ以外の特定のハンドラは、アポストロフィーSを用いて呼び出すことができます。
run "common/finance" 's amortize 143000,6.75,360
runコマンドは、スクリプトファイルだけではなく、あらゆるオブジェクトと一緒に使用できます。
run account's accrueInterest 30, 4.125
上の例は、以下と等価となります。
send accrueInterest 30, 4.125 to account
runコマンドがsendコマンドと同様の機能性を提供するとはいえ、runコマンドはスクリプトを実行するための代替構文を提供し、ユーザーがスクリプトのinitialハンドラを実行できるようにするのに対し、sendコマンドはこれを提供しません。また、runコマンドは、フロントスクリプトやバックスクリプト、ヘルパーを呼び出すことなく、スクリプトのinitialハンドラを直接実行します。
構文:
run scriptName {,} {parameters}
run scriptName 's handlerName {parameters}
run関数
挙動:スクリプトのinitialハンドラまたはその他のオブジェクトを明示的に関数として呼び出します。また、本関数は実行と同時に名前が生成されるスクリプトを呼び出すことが可能です。run関数は、ドット表記を使用するなどして、ターゲットオブジェクトに実行メッセージを送信することで呼び出す必要があります。
構文:
object.run(parameters)
{the} run of object {with parameters}
例:
set doubler to (script:"return 2*param(1)")
put doubler.run(12) -- 24
get ("test" & testNumber).run(value1, value2)
--スクリプトが同時に呼び出されます
doコマンド
doコマンドを使用してコードを実行すると、コードのコンパイルのためにSenseTalkコンパイラがその実行前に毎回呼び出されるため、スクリプトに同じステートメントが直接含まれる場合よりも遅くなります。repeatループの内部など、doコマンドが何回も実行される場合は、パフォーマンスへの影響がとりわけ大きくなります。
構文:
do expression
例:
do "put total into quarter" & currentQtrNumber
例:
do customCleanupCode
do AppleScriptコマンド、doAppleScript関数
振る舞い
変数に含まれるAppleScriptスクリプティング言語で記述される1つ以上のステートメント、または実行時にスクリプトによって生成される1つ以上のステートメントを実行します。最終値またはエラーは、the result内で入手できます。
構文:
do AppleScript expression
do expression as AppleScript
get doAppleScript(expression)
例
do acquireDataScript as AppleScript
put "eggPlant" into app
--表示したままにしておきたいアプリの名前
do AppleScript merge of {{
tell application "Finder"
activate
set visible of every process whose name is not "[[app]]" to false
end tell
}}
put doAppleScript(merge("get [[A]] + [[B]]")) into sumDoneTheHardWay
技術トピック
do AppleScriptコマンドは、expressionをAppleScriptステートメントとして評価し、AppleScriptインタプリタを呼び出すことでそのステートメントを実行します。値は、コード内でローカルSenseTalkの変数名と式を二重角括弧[[ ]]で囲み、AppleScriptの実行前にmerge関数を利用して値を挿入することで、AppleScriptコード内の任意の箇所で渡すことができます。
doAppleScript関数を利用して実行する際は、AppleScript式の最終値は、本関数によって返される値となります。エラーは、the result内の例外オブジェクトとして返されます。do AppleScriptをコマンドとして実行する場合は、the resultに例外オブジェクトか式の最終値が含まれます。
AppleScriptコードは、ローカルマシン上で実行されます。本メカニズムを利用して別のマシンにメッセージを送信する場合は、その他のマシンのシステム環境設定の共有パネル内でリモートイベントをオンにし、AppleScriptコードは以下のようなtellステートメントを利用してそのマシンにコマンドを送信する必要があります。
tell application "AppName" of machine "eppc://userName:password@xxx.xxx.xxx.xxx"
詳細情報は、AppleScript リファレンスでご確認ください。
sendコマンド
挙動:メッセージを別のオブジェクトに送信します。メッセージは、テキストとして評価される式となります。送信されるメッセージは、メッセージの文字列内部(calculateLoanの例)、または別々(accrueInterestの例)にパラメータを含みます。objectを指定しない場合は、メッセージはmeオブジェクト(すなわち、スクリプトを含むオブジェクト)に送信されます。
構文:
send message {to object}
send message parameters {to object}
例:
send "Hello" to newObject
例:
send "calculateLoan 10,9,5000" to "Loan"
例:
send accrueInterest 30, 4.625 to account
target関数
挙動:現在のメッセージの送信先のオブジェクトのロングIDを返します。メッセージの元のターゲットを知る必要がある場合に、メッセージの受け渡しパスのさらに下位のハンドラで役に立ちます。SenseTalkのバージョン1.1では、target構文を利用してターゲットオブジェクトに直接アクセスできます。target()構文は、ターゲットオブジェクトのロングIDを返す関数を呼び出します(メッセージパス内の別のスクリプトで上書きされていない場合)。この構文は、場合によっては効率がわずかに劣ることもありますが、ほとんどの目的においては同等に機能します。
構文:
the target
target()
例:
if the target is not me then ...
[ ](角括弧メッセージ)
挙動:角括弧を利用して、特定のオブジェクトに関数タイプのメッセージを送信します。角括弧構文は、それ自身でステートメントとして使用するか、または式の一部として関数呼び出しのように使用することができます。ただし、どちらの場合も送信されるメッセージは関数メッセージであるため、(on ハンドラではなく)toまたはfunctionハンドラによって処理する必要があります。
構文:
[ object functionMessage ]
[ object functionMessage: parameters]
例:
[currentLoan computeInterest:10,9,5000]
例:
answer "The result is: " & [calculator getResult]