これは 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
 一般的に言って、ハンドラの主目的が作業の実行であるなら、メッセージハンドラを作るべきである。もしハンドラの主目的が呼び出した側に値を返すことなら、関数ハンドラを作るべきである。


Returning a Value From a Function Handler
関数ハンドラから値を返す
 関数ハンドラは、その関数をコールしたハンドラに、計算した結果を送り返さなければならない。関数ハンドラから結果の値を返すには、関数ハンドラの中で return 制御構造を使う必要がある。呼び出し側は、関数コールの文を、返された値で置き換える。

 上にあるカスタム関数の例では、return 制御構造は、'expanded' 関数を呼んだ mouseUp ハンドラに、スペースを挟ませた文字列を返している。


Returning an Error in a Message Handler
メッセージハンドラからエラーを返す
 メッセージハンドラでは、return 制御構造は少し違った使われ方をされる。必要ならメッセージハンドラで return 制御構造を使って、コールしたハンドラにエラーメッセージを返すことが出来る。コールしたハンドラ側では、メッセージハンドラが return 制御構造で返した値を、result 関数で取り出すことが出来る。

 これはダイアログボックスを表示するメッセージハンドラのサンプルである:
  on echoAMessage
    ask "What do you want to show?"
    if it is empty then return "No message!"
    else answer it
  end echoAMessage
 このハンドラはユーザーにメッセージの入力を促して、それをダイアログボックスに表示するものである。もしユーザーが何も入力しない(または Cancel をクリックした)場合、このハンドラは呼び出したハンドラにエラーメッセージを返す。

 'echoAMessage' カスタムコマンドを利用するハンドラは、そのコマンドが正しくメッセージを表示したかどうかを result 関数を使って確かめることが出来る:
  on mouseUp
    echoAMessage
    if the result is empty then beep
  end mouseUp

Passing Values to a Handler
ハンドラに値を渡す
 パラメータ(引数)とは、ハンドラからハンドラに渡す値のことである。上にある最初のサンプルを使うには、'alertUser' メッセージと一緒にパラメータを送る:
   alertUser "You clicked a button!"
 'You clicked a button!' パラメータは 'alertUser' ハンドラに送られ、それに対応するパラメータ変数(引数変数)'theMessage' の中に入れられる。 'alertUser' ハンドラはこのパラメータを文の中で使用することが出来る:
  on alertUser theMessage
    beep
    answer theMessage
  end alertUser
 2つ以上のパラメータを渡すには、パラメータをカンマで区切る。

 パラメータはローカル変数であり、ハンドラの実行が終わった時点で消えて無くなる。

Empty parameters:
空のパラメータ
 ハンドラの持つパラメータ変数の数よりも、少ない数のパラメータを渡される場合がある。もし渡されたパラメータよりパラメータ変数の方が多い場合は、残りのパラメータの値は empty になる:
  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 になる。

Implicit parameters:
暗黙のパラメータ:
 呼び出し文が、ハンドラの受け取るパラメータよりも多くのパラメータを渡した場合、受け取った側のハンドラは、params 関数を使ってそれにアクセスすることが出来る:
  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:
パラメータを参照で渡す:
 パラメータ変数の名前に @ が付いている場合、そのパラメータの値は変数の値ではなく、変数の名前である。呼ばれたハンドラ内でその変数の値を変更すると、コールしたハンドラ側の変数の内容が変わる。

 このハンドラは、パラメータをひとつ受け取り、そこに1を加えるものである:
  on setVariable @incomingVar
    add 1 to incomingVar
  end setVariable
 これは 'setVariable' ハンドラをコールするハンドラである:
  on mouseUp
    put 8 into someVariable
    setVariable someVariable
    answer "someVariable is now:" && someVariable
  end mouseUp
 mouseUp ハンドラを実行すると、ダイアログに 'someVariable is now: 9' と表示される。これは、someVariable が参照渡しで setVariable ハンドラに渡されたために、setVariable がそのパラメータ変数に1を加えた時に、その値が変更されたためである。

邦訳/文責:UDI
2003.01.18
2003.01.19

inserted by FC2 system