これは RuntimeRevolution 1.1.1 のヘルプにある文書を邦訳したものです。この文書の文責はUDIにあり、またUDIはこの文書についての一切の債務を負いません。 間違いがありましたら eudio@chabashira.co.jp までお知らせ下さい。この文書は必要と思われる時に適宜アップデートされます。
Help -> Revolution Documantation -> Development Guide -> Writing Transcript code -> About... commands and functions
About commands and functions
コマンドと関数
==============
参照:
--------------
About the structure of a script, How to execute a command, commandNames function, function control structure, functionNames function, on control structure, return control structure
コマンドと関数は、Transcript 文を構成する基本要素である。コマンドは何かを実行するものであり、関数は値を計算するものである。 Transcript には組み込みのコマンドと関数があり、加えて、他のハンドラから利用するコマンドや関数を、作ることが出来る。
このトピックでは、コマンドと関数がどのように実行されるか、カスタムコマンドや関数をどのように作るか、ハンドラのコールで情報を受け渡す方法、そしてカスタムハンドラや関数について解説する。
このトピックを充分に理解するためには、オブジェクトの作り方と、Transcript の関数やコマンドを使った簡単なスクリプトの書き方を知っている必要がある。もし 'Getting Started' チュートリアルが済んでいるなら、これらの知識は得られている。
Contents:
Command Messages & Function Messages
Creating Custom Commands and Functions
Returning a Value From a Function Handler
Returning an Error in a Message Handler
Passing Values to a Handler
Command Messages & Function Messages
コマンドメッセージと関数メッセージ
Revolution が送るメッセージには2つの種類がある。イベントが起きた時に送られる組み込みメッセージと、どこかのハンドラが組み込みコマンド以外のコマンドを実行した時に送られるコマンドメッセージである。
ハンドラが Revolution の組み込みコマンド以外のコマンドを実行すると、Revolution は、そのスクリプトを持つオブジェクトに、そのコマンドをメッセージとして送る。もしそのスクリプトにコマンドと同じ名前のハンドラがあれば、そのメッセージハンドラが実行される。そうでなければそのメッセージは、メッセージパスの次にあるオブジェクトにパスされる。
同様にして、ハンドラが Revolution 組み込み関数以外の関数をコールすると、Revolution はそのスクリプトを持つオブジェクトにその関数コールを送る。もし同じ名前の function ハンドラがあれば、そのハンドラが実行される。
Creating Custom Commands and Functions
カスタムコマンドと関数を作る
カスタムコマンドを作るには、、コマンドと同じ名前のメッセージハンドラを作り、それを使うオブジェクトのスクリプトか、またはそのオブジェクトのメッセージパス上にあるオブジェクトのスクリプトに置く。コマンドを実行すると Revolution はメッセージを送り、そのメッセージがメッセージハンドラを実行するトリガーとなる。カスタムコマンドで実行させたい作業は、そのハンドラの中に書く。
例えばユーザーに注意を促すために、ビープを鳴らしてダイアログボックスを表示するとしよう。それにはこのような簡単なメッセージハンドラを書いて、スタックのスクリプトに置けば良い:
on alertUser theMessage beep answer theMessage end alertUserこれでスタック上の任意のスクリプトから 'alertUser' コマンドが使用可能になる。 Revolution は 'alertUser' カスタムコマンドに出会うと 'alertUser' メッセージを送って、上にある 'alertUser' ハンドラを起動させる。ビープ音を鳴らしてダイアログボックスを表示するには、このようなハンドラを使う:
on mouseUp alertUser "You clicked a button!" end mouseUpメッセージハンドラの代わりに function ハンドラを作るという点以外は、カスタム関数の作り方も非常に良く似ている。これは、文字列の各キャラクタの間にスペースを入れるカスタム関数である:
function expanded theString repeat for each character nextChar in theString put nextChar & space after expandedString end repeat return char 1 to -2 of expandedString end expandedこのカスタム関数を他のハンドラから利用するには、式の中に関数コールを入れる。これは上の関数を使うサンプルである:
on mouseUp ask "What string do you want to expand?" answer expanded(it) end mouseUp一般的に言って、ハンドラの主目的が作業の実行であるなら、メッセージハンドラを作るべきである。もしハンドラの主目的が呼び出した側に値を返すことなら、関数ハンドラを作るべきである。
on echoAMessage ask "What do you want to show?" if it is empty then return "No message!" else answer it end echoAMessageこのハンドラはユーザーにメッセージの入力を促して、それをダイアログボックスに表示するものである。もしユーザーが何も入力しない(または Cancel をクリックした)場合、このハンドラは呼び出したハンドラにエラーメッセージを返す。
on mouseUp echoAMessage if the result is empty then beep end mouseUp
alertUser "You clicked a button!"'You clicked a button!' パラメータは 'alertUser' ハンドラに送られ、それに対応するパラメータ変数(引数変数)'theMessage' の中に入れられる。 'alertUser' ハンドラはこのパラメータを文の中で使用することが出来る:
on alertUser theMessage beep answer theMessage end alertUser2つ以上のパラメータを渡すには、パラメータをカンマで区切る。
on processOrder itemName,itemSize,numberOfItems put itemName into field "Name" put itemSize into field "Size" if numberOfItems is empty then put 1 into field "Number" else put numberOfItems into field "Number" end processOrder次の文は一着のセーターをオーダーする文である:
processOrder "sweater","large"この文はパラメータを2つしか送っていないが、'processOrder' ハンドラはパラメータ変数を3つ持っているので、3つめのパラメータ変数 'numberOfItems' は、empty になる。
function product firstFactor,secondFactor put firstFactor * secondFactor into theProduct if the paramCount > 2 then repeat with x = 3 to the paramCount multiply theProduct by param(x) end repeat end if return theProduct end product上にある関数は2つのパラメータを受け取るが、params 関数を使って、3つめ以降のパラメータにアクセスすることも出来る。下にある文は、'product' カスタム関数に4つのパラメータを渡している:
answer product(22,10,3,7)Calling parameters by reference:
on setVariable @incomingVar add 1 to incomingVar end setVariableこれは 'setVariable' ハンドラをコールするハンドラである:
on mouseUp put 8 into someVariable setVariable someVariable answer "someVariable is now:" && someVariable end mouseUpmouseUp ハンドラを実行すると、ダイアログに 'someVariable is now: 9' と表示される。これは、someVariable が参照渡しで setVariable ハンドラに渡されたために、setVariable がそのパラメータ変数に1を加えた時に、その値が変更されたためである。