これは RuntimeRevolution 1.1.1 のヘルプにある文書を邦訳したものです。この文書の文責はUDIにあり、またUDIはこの文書についての一切の債務を負いません。 間違いがありましたら eudio@chabashira.co.jp までお知らせ下さい。この文書は必要と思われる時に適宜アップデートされます。なお、実際のヘルプにはボタンやフィールドがありますが、ここでは訳文のみを載せます。

Help -> Using the Starter Kit


1. Introduction
始めに

 無料で提供されている Revolution Starter Kit は Revolution の完全な機能を持っており、Revolution の全ての開発機能にアクセスすることが出来る。 Starter Kit は単なるデモ版ではなく、例えば Revolution がサポートする全てのプラットホームの、完全なスタンドアローン・アプリケーションを作ることが出来る。あなたは無料の Starter Kit を使って、何の対価も払わずに、商用アプリケーションさえ配布可能である。これは趣味プログラマと中小企業ユーザーにとって理想的と言える。

 Starter Kit はライセンスを取得した Revolution のコピーと違って、編集出来るスクリプトの長さに制限がある。( Revolution のライセンス・オプションや、ライセンスを取得して Starter Kit の制限を外す方法については、ヘルプメニューの "License Revolution" を参照のこと) Starter Kit の主な制限は、コンパイル出来るスクリプトが 10ステートメントに限られていると言うことだけである。

 もしあなたが本気で Revolution で開発を行いたいと考えているなら、あなたの Revolution のコピーを便利で実用的なものにするために、ライセンスを取得してスクリプトの制限を解除しなさい。しかし、ちょっとしたツールや小さなアプリケーションを時々作るだけならば、Starter Kit はそのままで充分役立つだろう。

 コードはオブジェクトにつき 10ステートメントに制限されているが、あなたはこの制限に直面してこう考えるだろう。例えばオブジェクトは独立して機能しているのではない。あるオブジェクトが他のオブジェクトにメッセージを送って、二つ目のオブジェクトのハンドラを起動することもある。これは長さ制限を越えたスクリプトを他のオブジェクトに移すことにより、より長いスクリプトを書ける可能性があることを意味する。

 このセクションでは、Starter Kit の範囲内で、Revolution の全機能を使うための手助けをする。スクリプトを分割する手間さえ厭わなければ、何百行のスクリプトでも書くことが出来るようになる。

 このセクションを始める前に、あなたは少なくとも最初のチュートリアル Getting Started を済ませて、Revolution アプリケーション作成の基礎を学んでおかなければならない。各ツールを使ってオブジェクトを作り、スクリプトを編集し、メッセージボックスからコマンドを実行する方法を修得しておく必要がある。

 各ページが済んだら、ウィンドウの右下にある右矢印ボタンをクリックして、次に進みなさい。



2. The script limits in detail
スクリプトの制限について

 あなたはまず最初に、Starter Kit にどんな制限があるのかを知りたいだろう。 Transcript の scriptLimits関数は、あなたの持っている Revolution のコピーの、制限事項をリストアップする関数である。まずはそれを試そう...

1. Tools メニューの "Message Box" を選択して、メッセージボックスを表示させる。(メッセージボックスとは Transcript のステートメントを1行だけ実行したり、関数の実行結果を得ることが出来る、手軽なコマンドライン・パレットである)

2. 次の行をメッセージボックスに入力する。

  put the scriptLimits
そして Return キーを押す。

 メッセージボックスの一番下の枠に、4つの数字がリストされる。これらの数字が何を意味するものか、調べてみよう。

 重要! もしあなたの持っている Revolution がライセンス取得済みのコピー(すなわち、ライセンスを購入して、その解除コードを License Revolution ダイアログボックスに入力したもの)であるなら、scriptLimits 関数は empty を返すので、メッセージボックスには何も表示されない。つまりライセンスを取得したコピーには何の制限も存在しないので、ライセンスされたコピーで scriptLimits 関数を使っても何も返さない。

 4つの数字は Starter Kit の4種類の制限を示している。それぞれの意味は:

10
最初の数値はスクリプトの最大行数。これが一番重要な制限である。

この制限はスクリプトの実行時ではなく、コンパイル時に適用される。Starter Kit は制限を越えるスクリプトを持つオブジェクトを含んだスタックを開くことは出来る。しかし Starter Kit を使って制限を越えるものを作ったり、編集することは出来ない。

10
二つ目の数値は、do コマンドを使って実行できるスクリプトの最大行数。( do コマンドは任意のテキストを実行することが出来る。保存されたテキストでも、その場で作られたものでも、まるでそれがハンドラの一部であるように実行する。 do コマンドについては、別のセクションで更に学ぶ)

50
三つ目の数値は、start using コマンドを使って、メッセージパスの中へ置くことの出来るスタックの最大数である。

10
四つ目の数値は、insert script コマンドを使って、メッセージパスの中へ置くことの出来るオブジェクトの最大数である。あなたは 10個のオブジェクトをメッセージパスの front に、もう 10個を back に置くことが出来るので、全部で 20個のオブジェクトを置くことが出来る。

 これらの制限は Revolution 内部にあり、ライセンスを購入することによってしか変更することは出来ない。



3. What counts as a line of script?
スクリプトの数え方

 10ステートメントという制限は Starter Kit の一番重要な制限であるため、それをどのようにカウントしているかを知るのは大切なことである。一部のスクリプトは制限されるものとしてカウントしない。

ステートメント行(数えるもの):
 ・コマンドを含む行
 ・最初のハンドラの第1行目

 もしひとつの行の中に、セミコロン( ; )で区切った複数のステートメントがあった場合、それぞれのステートメントは別の行としてカウントされる。

ステートメント行でない(数えないもの):
 ・コメントだけの行
 ・空白行
 ・制御構造(ハンドラの最初の行を除く)

 もしひとつの行を \ キーワードで分割していた場合は、それは1行としてカウントされる。

 制御構造だけの行はカウントされないので、実際には 10行より少し長いスクリプトを書くことが出来る。制御構造には、repeat、switch、case、break、try、catch、finally、そして end を含む。 if または else で始まる行は、それがコマンドを含んでいない限りはカウントしない。 on、function、setProp、getProp で始まるハンドラの最初の行は、最初のハンドラの第1行目でない限りカウントされない。

 注意が必要なのは、スクリプトの最初の行は常にハンドラの先頭であり、カウントされることである。そのため最大でも残り9つしかコマンドステートメントを書くことは出来ない。同様に、10行の中でステートメントをコールする "do" ステートメントは、最大でも9行しか使えない。

 次に、このルールが実際のスクリプトにどのように適用されるのかを見てみよう。



4. Counting lines in an example script
サンプルスクリプトを数える

実際のヘルプにはサンプルボタンがありますが、ここではテキストだけを載せます。

 ウィンドウの下部に、"Random Answer" というシンプルな機能のボタンがある。ボタンをクリックすると、ランダムな数字を表示する。

 このボタンのスクリプトは、このように1行ごとにコメント行が挟まっている。
on mouseUp							-- line 1
  put random(8) into myRandomNumber		-- line 2
  if myRandomNumber is 1 then			-- 数えない
    answer  "The number is 1."			-- line 3
  else if myRandomNumber is 2 then			-- 数えない
    answer  "The number is 2."			-- line 4
  else if myRandomNumber is 3 then			-- 数えない
    answer  "The number is 3."			-- line 5
  else if myRandomNumber is 4 then			-- 数えない
    answer  "The number is 4."			-- line 6
  else if myRandomNumber is 5 then			-- 数えない
    answer  "The number is 5."			-- line 7
  else if myRandomNumber is 6 then			-- 数えない
    answer  "The number is 6."			-- line 8
  else if myRandomNumber is 7 then			-- 数えない
    answer  "The number is 7."			-- line 9
 else if myRandomNumber is 8 then			-- 数えない
    answer  "The number is 8."			-- line 10
  end if							-- 数えない
end mouseUp							-- 数えない
 line 1 は mouseUp ハンドラの第1行目であり、このハンドラがユーザーがボタンをクリックした時に実行されるものであることを示している。これはスクリプト内の最初のハンドラの第1行目であるため、制限行の中にカウントされる。

 line 2 は 1 から 8 までの乱数を作り出し、その番号を "myRandomNumber" という変数に入れている。

 残りの行は、乱数の値をチェックして、answer コマンドでその数値をダイアログボックスに表示している。

 もちろん、このスクリプトはこの種の作業をするには非常に非効率的である。もっと短く書けばこれだけで済んでしまう:
  on mouseUp
    answer "The number is" && random(8) & "."
  end mouseUp
 この単純化は Starter Kit を使う上でのもうひとつの原則を暗示している:つまり Transcript 言語を良く知ることで、同じことをより少ない行で実現することが可能である。

 次に、より複雑なスクリプトを制限の範囲内に収める方法を学習する。



5. Looking at an oversize script
大きすぎるスクリプト

実際のヘルプにはサンプルボタンやフィールドがありますが、ここではテキストだけを載せます。

 下にある "Draw Graph" ボタンのスクリプトは、左のフィールドから数値を読んで、そのデータをグラフとして表示するものである。このスクリプトは 25行の実行行を持っており、Starter Kit でコンパイルするには大きすぎる。

 フィールドに数値を入れて "Draw Graph" ボタンをクリックすれば、実際のスクリプトの動作を見ることが出来る。

 次に、このスクリプトを短くする方法を学ぶ。



6. Shortening the script
スクリプトを短くする

 これが前のページにあった "Draw Graph" ボタンのスクリプトである。コメント( コメントデリミタである "--" で始まっている行)を参考にして、各行が何をしているのか読みなさい。
on mouseUp
  -- グラフの書き換えを1度に見せるため
  lock screen
  -- フィールドデータを変数にコピーする
  put field "the data" into tData
  -- データの数を入れる
  put the number of lines in tData into tNoLines
  -- 変数の中で複数の行に跨っているデータを、
  -- カンマ区切りのひとつのデータにまとめ、min/max 関数に備える
  replace return with comma in tData
  put ",0" after tData
  -- グラフの最大の高さは 60ピクセルである
  -- それぞれの値をスケーリングするために、
  -- 最大の値を変数 tMax に入れる
  put max(tData) into tMax
  -- 最小の値を変数 tMin に入れる
  put min(tData) into tMin
  -- 最大値と最小値の差を得る
  put tMax - tMin into tDifference
  -- 全ての値が 60 に収まるようスケーリングする
  put 60 / tDifference into tMultiplier
  -- 変数を初期化しておく
  put empty into tResult
  put empty into tFinalData
  -- それぞれの値を処理する
  repeat with i = tNoLines down to 1
    -- ひとつの値の高さを計算する
    put trunc(item i of tData * tMultiplier) into tHeight
    -- ここでその値の座標を決める
    put i,0 into tResult
    put return & i,-1 * tHeight after tResult
    put return & i+1,-1 * tHeight after tResult
    put return & i+1,0 after tResult
    put return & i,0 & return & return after tResult
    -- グラフを描くための座標データ変数に、
    -- 計算した座標を追加していく
    put tResult into line i of tFinalData
  end repeat
  -- ポリゴン( polygon )グラフィックのプロパティ設定
  set the relativePoints of graphic "DataGraph1" to tFinalData
  -- グラフィックのスケールを 100ピクセル幅にする
  set the width of graphic "DataGraph1" to 100
  -- グラフィックの位置
  set the loc of graphic "DataGraph1" to 311,217
  -- ランダムなカラーを決める
  put the random of 4 into tRandomNumber
  put item tRandomNumber of "dodgerblue1,red,yellow,green" \
      into tColor
  -- カラーをセットする
  set the backGroundColor of graphic "DataGraph1" to tColor
  -- スクリーンの再描画
  unlock screen
end mouseUp
 これをそのまま 10行に収めてみよう:
on mouseUp
  -- "idle" 時に常に unlock されるため、明示的な unlock は不要である
  -- 例えば何もスクリプトを実行していない時や、
  -- mouseUp ハンドラが実行を終えた時に自動的に行われる
  lock screen
  -- replaceText 関数で行をデータに変換するときに、
  -- ついでに ",0" も加えてしまう
  put replaceText(field "the data",return,comma) & ",0" into tData2
  -- ここで複数行をいっきにまとめる
  -- この行は括弧の中から外に向かって順に実行される
  put min(60/(max(tdata2) - min(tdata2))) into tMultiplier
  -- 我々はフィールドの値を変数に入れずに、直接参照するようにした。
  -- スクリプトが短くデータも少ないので、変数を使用した場合との
  -- パフォーマンスの違いは殆ど無いだろう。
  -- またこれによりローカル変数が不要になった。
  -- 必要なら local キーワードを利用して "put empty" を省くことも出来る。
  -- local キーワードは制限される行としてカウントされない。
  repeat with i = the number of lines of field "the data" down to 1
    put trunc(line i of field "the data"*tMultiplier) into tResult
    -- ここでも複数の行をひとつにまとめている
    put i,0 & return & \
        i,-1* tResult & return & \
        i+1,-1* tResult & return & \
        i+1,0 & return & \
        i,0 & return & return into line i of tdata
  end repeat
  -- これらの行は前のスクリプトと同じ
  set the points of graphic "DataGraph1" to tdata
  set the width of graphic "DataGraph1" to 100
  set the loc of graphic "DataGraph1" to 311,217
  -- 最後に、ランダムなカラーを1行で作っている
  set the backGroundColor of graphic "DataGraph1" \
      to item(random(4)) of "dodgerblue1,red,yellow,green"
end mouseUp
 新しいスクリプトは 10行に収まったのに、25行あったオリジナルと同じ働きをする。

 おまけ:このスクリプトを更にもう1行短くできると言ったら信用するだろうか? 興味があるなら調べてみなさい。(最後に近い2行で rectangle プロパティを利用できないか?)



7. Using multiple object
他のオブジェクトを利用する

 時に、どんなに努力しても、ひとつのオブジェクトのスクリプトが 10行に収まらないこともある。

 そんな時は、スクリプトの一部を他のオブジェクトに移せばよい。最初のオブジェクトのスクリプトは、メッセージパスにある他のオブジェクトのハンドラを使うことが出来る。メッセージパスとは、最初のオブジェクトに対応するハンドラが無かった場合に、メッセージが進む先を決定するものである。

 Revolution の各オブジェクトにはオーナー( owner )があり、それはそのオブジェクトを含んでいるオブジェクトである。例えばボタンのオーナーはカードであり、カードのオーナーはスタックである。各オブジェクトはそのオーナーのメッセージパスの一部であり、またそのオーナーも、同様にして他のオブジェクトのメッセージパスの一部である。あるオブジェクトのスクリプトが関数を呼んだりメッセージを送ると、メッセージパスにある他のオブジェクトの関数ハンドラやメッセージハンドラが起動するかも知れない。

 前の例では、スクリプトを制限内に収まるよう短くした。もうひとつの方法は、スクリプトの一部をハンドラとして分け、メッセージパスにある他のオブジェクトに移すことである。例えばカードスクリプトに関数ハンドラがある:
function calculatePoints tNoLines, tData, tMultiplier
  repeat with i = tNoLines down to 1
    put trunc(item i of tData * tMultiplier) into tHeight
    put i,0 into tResult
    put return & i,-1 * tHeight after tResult
    put return & i+1,-1 * tHeight after tResult
    put return & i+1,0 after tResult
    put return & i,0 & return & return after tResult
    put tResult into line i of tFinalData
  end repeat
  return tFinalData
end calculatePoints
 この "calculatePoints" ハンドラは "Draw Graph" ボタンのスクリプトから取り分けたものである。そしてこれらの行を取り除いた部分に、"calculatePoints" ハンドラを呼ぶスクリプトを書く:

  set the relativePoints of graphic "DataGraph1" to \
     calculatePoints(tNoLines, tData, tMultiplier)
 ティップス:グループは、常にそこに含まれるオブジェクトのメッセージパスにある。これは、使えるオブジェクトがメッセージパス中に無い時 −例えばカードスクリプトが既に一杯になっている時− に、オブジェクトをグループ化して、そこに余ったスクリプトを( "calculatePoints" のような独立したハンドラとして)置くことが出来ることを意味する。



8. Going outside the message path
メッセージパスの外へ

実際のヘルプにはサンプルボタンがありますが、ここではテキストだけを載せます。

 長すぎるスクリプトをハンドラに変えて移動するのに、メッセージパスにあるオブジェクトを探すのは大変である。メッセージパスの外のオブジェクトにもスクリプトを置ければ便利だろう。これには2通りの方法がある。

 1つ目の方法は、send コマンドを使って、オブジェクトにダイレクトにメッセージを送ることである。これはオブジェクトにひとつのメッセージを送るのに便利である。2つ目の方法は、insert script コマンドを使って、使いたいオブジェクトをメッセージパスの中へ加えることである。この方法を使うと、remove script でメッセージパスから削除するまで、任意のオブジェクトのスクリプトを他のオブジェクトから継続的に使うことが出来る。

 あなたは任意のメッセージを、そのメッセージハンドラ( on <message> )を持つ任意のオブジェクトに送ることが出来る。(この方法では関数を呼ぶことは出来ない)

 もしメッセージを送ったオブジェクトがそのメッセージハンドラを持っていれば、そのハンドラが実行される。そうでなければ、そのメッセージハンドラを持つオブジェクトを見つけるまで、メッセージがメッセージパスに沿って進んでいく。これは、send コマンドを使う時に、ターゲットのオブジェクトのスクリプトだけでなく、そのオブジェクトのメッセージパスにあるオブジェクトも使えることを意味する。例えばこのような send 文があったとする:
  send "mouseUp" to button "myButton" of card 3
 この文は mouseUp メッセージを "myButton" に送っている。もし "myButton" のスクリプトに mouseUp ハンドラがあれば、それが実行される。そうでなければ、mouseUp メッセージは "myButton" ボタンのオーナーである card 3 に渡され、カードにある他の mouseUp ハンドラが実行される。

 send の対象になるオブジェクトは、カレントカード上のものでなくても、またカレントスタックにあるものでなくても構わない。あなたは利用できるどんなオブジェクトにもメッセージを送ることが出来る。

 また、どんなオブジェクトもメッセージパスに置くことが出来る。これらのオブジェクトの全てのハンドラ −関数ハンドラも− は、各オブジェクトから利用出来るようになる。例えば、insert script コマンドを使ってボタンをメッセージパスに置くと、Revolution の全てのオブジェクトは、そのボタンにある任意の関数ハンドラとメッセージハンドラを利用出来る。あなたはオブジェクトをメッセージパスの front にも、back にも置くことが出来る。

 front に insert されたスクリプトは、最初にメッセージを受け取り、オブジェクトはその後にメッセージを受ける。 back に insert されたスクリプトは、メッセージパスにある全てのオブジェクトよりも後にメッセージを受け取る。 Starter Kit では front に 10個まで、back に 10個までのオブジェクトを置けるので、簡単に 20個までのオブジェクトのスクリプトにアクセスすることが出来る。

 重要! Revolution の開発環境は、開発時に frontScripts と backScripts を挿入する。これらは 10オブジェクトの制限にカウントされるが、スタンドアローンとしてビルドした後には無くなる。

 start using コマンドは insert script コマンドと似ているが、スタック以外のオブジェクトは利用することが出来ない。 start using を使って 50 までのスタックを使うことが出来、任意のオブジェクトはスタックスクリプトにある任意のハンドラを利用することが出来る。

 insert script コマンドを使ってメッセージパスに置かれたオブジェクトを、どうやって使うのか実例を見てみよう。

 ウィンドウの下の方に "Do Factorial with frontScript" ボタンは、フラクタルな数字の計算をする。 10行制限に合わせるために、実際に計算する関数部分は "front script example" という見えないボタンに置かれている。 "Do Factorial with frontScript" ボタンは隠されたボタンのスクリプトにある関数を利用することが出来る。このボタンのスクリプトは以下の通り:

on mouseUp
  insert the script of button "front script example" into front
  ask "Find the factorial of what number?"
  answer myFactorial(it)
  remove the script of button "front script example" from front
end mouseUp
 そして隠された "front script example" ボタンのスクリプト:
function myFactorial n
  if n div 1 = n and n >= 0 then
    put 1 into x
    repeat with i = n down to 2
      multiply x by i
    end repeat
  else
    return "Input must be a non-negative integer."
  end if
  return x
end myFactorial
 次に、do コマンドのパワーを調べてみよう。これを使うと、任意のテキスト −フィールドや、カスタムプロパティや、スクリプトで作った文字列− を実行することが出来る。



9. Using the do command
do コマンドを利用する

 do コマンドは Transcript 言語において最も重要なツールのひとつである。 do コマンドを使ってテキストを、まるでそれがスクリプトの中にあるもののように実行することが出来る。

 do コマンドを使う利点は、実行したいテキストをどこにでも保存出来、必要な時にいつでもそれを実行出来ることである。また do はどこにあるテキストでも実行できるので、スクリプトをカスタムプロパティに保存することも可能である。(カスタムプロパティは、任意のオブジェクトに作ることが出来る、データの格納場所である。カスタムプロパティにアクセスするには、オブジェクトのプロパティパレットの Custom タブを使う) カスタムプロパティを使えば、長さを制限されずに、スクリプトを効果的にひとつのオブジェクトに保存することが出来る。

do コマンドを試すために、新しいスタックにフィールドをひとつ作り、これを入力しなさい:
  answer "Hello World"
  beep
次に、これをメッセージボックスに入力して、Return キーを押す:


do (the text of field 1)
 フィールドにある2つの文が、スクリプトとして実行される。

 ライセンスを受けた Revolution のコピーなら、どんなハンドラや関数でもひとつのスクリプトに収めることが出来る。例えばボタンにこんな mouseUp ハンドラを置くことが出来る:
on mouseUp
	run some stuff
	put function1(w,h) into f_result
	run some more stuff
	handler2 x,y,k
	run some more stuff
end mouseUp
 Starter Kit の制限が無ければ、"function1" も "handler2" も同じスクリプト内に一緒に置ける。しかし Starter Kit を使っていて、もしこれらのハンドラが 10行に収まらないほど長く複雑だったらどうしたら良いだろう?

 ここで do コマンドが便利に使える。 Starter Kit の制限内で、9個を越える関数やハンドラをひとつのオブジェクトのスクリプトで扱うには、このようにする:
on mouseUp
  do the mouseUpStuff of me
end mouseUp
 この例では、"mouseUpStuff" はオブジェクトのカスタムプロパティであり、mouseUp で実行すべきスクリプトが入っている。オブジェクトに置きたいスクリプトをそのままカスタムプロパティに入れて、do コマンドでカスタムプロパティにあるコードを実行している。

 カスタムプロパティのコードは、ひとつのスクリプトから 9行しかコールできない。( Starter Kit では do コマンドの使用は 10個に制限される。そして do 文は 1つにつき 1行にカウントされる) しかし 9行以上必要な時はどうする? ここで、制限内で実行できる方法を2つ紹介する:

1. コードの最後にもうひとつ do コマンドを入れて、カスタムプロパティのコードを実行させる。このネスト(入れ子)になった do コマンドは、別のカスタムプロパティに入れた残りのコードを実行する。このテクニックを応用して、カスタムプロパティから他のコードを次々とチェーンのように実行させることが出来る。

2. カスタムプロパティのコードに、別のカスタムプロパティを実行するコードを入れる。例えばこんなコードをカスタムプロパティ "mouseUpStuff" に置く。
  do the firstMouseUpStuff of me
  do the secondMouseUpStuff of me
  do the thirdMouseUpStuff of me
  do the fourthMouseUpStuff of me
  -- 9つ以上の "do" 文を置くことが出来る
 このテクニックを insert script コマンドと併用することによって、スクリプトから使える関数ハンドラの数を増やして行くことが出来る。例えばボタンを作って、そのスクリプトに 9つの関数ハンドラを入れ、それぞれの関数ハンドラからボタンのカスタムプロパティコードを実行する do コマンドを実行させる。そのボタンを frontScripts や backScripts に insert すれば、あなたのオブジェクトはその 9つの関数を自由に使うことが出来る。

 ティップス: do コマンドによるステートメントの実行は、スクリプトの実行よりも遅い。これは、スピードを要求しないものを do テクニックで処理し、スピードを要求するものはスクリプトで実行するように、スタックをカスタマイズ出来ることを意味する。



10. A more complex example using do
更に複雑なスクリプト

実際のヘルプにはサンプルボタンやフィールドがありますが、ここではテキストだけを載せます。

 下にある "Show Statistics" ボタンは、いくつかの統計計算をするものである。ここにそのスクリプトがあるが、長さが32行あり、Starter Kit の制限を越えている。

 この問題を解決するには、スクリプトの一部をメッセージパス上のオブジェクトに移動して、スクリプトを短くしなければならない。しかしこの気難しいスクリプトは、それまでのテクニックではカバー出来ない。スクリプトが長すぎてひとつのオブジェクトに収まらない上に、スクリプト内の随所で使われている変数をそのオブジェクト間で共有しなければならない。

 代わりに、スクリプトをバラバラにして、カスタムプロパティに入れる。そして do コマンドを使ってそれらを実行する。スクリプトを分割するポイントをここに示す:
on mouseUp
  local n = 0, sumx = 0, sumxsq = 0
  -- 以下をカスタムプロパティ ST1 に入れる
  put the milliseconds into t
  repeat with i = 1 to 40 + random(20)
  put random(1000)/10 into line i of k
  end repeat
  put k into fld "Data1"
  repeat for each line i in k
    add 1 to n
    add i to sumx
    add i^2 to sumxsq
  end repeat
  -- 以下をカスタムプロパティ ST2 に入れる
  put sumx/n into mean
  put (sumxsq - sumx^2/n)/(n-1) into svar
  put sqrt(svar) into myStdDev
  put sqrt((n-1)/n)*myStdDev into popdev
  sort lines of k ascending
  put line 1 of k into minX
  put line(-1) of k into maxX
  -- 以下をカスタムプロパティ ST3 に入れる
  if n mod 2 = 1 then
    put line (.5+n/2) of k into med
  else
    put .5*(line(n/2) of k + line(n/2+1) of k) into med
  end if
  put n div 4 into qx
  if n mod 4<>0 then add 1 to qx
  put line qx of k into Q1
  put (3*n) div 4 into qx
  if (3*n) mod 4 <> 0 then add 1 to qx
  put line qx of k into Q3
  -- 以下をカスタムプロパティ ST4 に入れる
  put mean, sumx, sumxsq, myStdDev, popdev, n, minX, Q1, med, Q3, maxX into thevars
  put me into theTitles
  repeat with i = 1 to the number of lines of me
    put line i of theTitles && \
    item i of thevars into line i of ans
  end repeat
    answer "Statistical analysis:" \
    & return & ans & return & return & \
    "Time:" &&  the milliseconds - t
end mouseup
 コードをカスタムプロパティに移動したあとは、ボタンスクリプトはこのようになる:
on mouseUp
  local n = 0, sumx = 0, sumxsq = 0
  set the numberFormat to "0.##########"
  do the ST1 of me
  do the ST2 of me
  do the ST3 of me
  do the ST4 of me
end mouseUp
 オリジナルのスクリプトを iMac 266 で実行すると、平均で 20 milliseconds を要した。 do コマンドを使ったものは僅かに遅く、その平均は 22 milliseconds であった。

 ティップス: repeat ループの中に do コマンドを入れてはならない。効率を上げるためには、do で実行するテキストの中に、repeat から end repeat までのループ構造を全て入れる。

 もし repeat ループが 9行以上のスクリプトを含むなら、2つのループを組んで、それぞれを do コマンドで実行しなさい。



11. Hints,tips,and tricks
ヒント、ティップス、そしてトリック

 Starter Kit 上で作業する時に気を付けること。

 まずこれまでこのセクションで学んだテクニックをしっかり頭に入れておく:

 ・最初に出来るだけスクリプトを短くする
 ・コードをメッセージパス上の他のオブジェクトに移す
 ・send コマンドを使って他のオブジェクトのメッセージハンドラを実行する
 ・insert script コマンドを使って、他のオブジェクトを利用する
 ・do コマンドを使って、カスタムプロパティに保存したテキストを実行する

 Transcript 言語を学習する: 問題は意外に単純かも知れない。学習を進めることで問題解決がよりシンプルになる。

 まず計画をたてる: 制限内に収める作業を始める前に、実際にフィールド(や紙の上)にスクリプトを書いて眺めてみる。

 スクリプトを数える: これまで学んだ方法でスクリプトを数え、それが 10行に収まるかどうか検討する。もしかしたら問題は単純かも知れない。

 長いスクリプトをブロックに分ける: 分割したブロックをカスタムプロパティに入れることによって、do コマンドで各カスタムプロパティをハンドラのように実行することが出来るようになる。最初のカスタムプロパティのコードに do 文を入れて、他のオブジェクトのカスタムプロパティコードを実行することも出来る。

 テストコードを入れる: ブロックにテストコードを入れることで、より早く簡単にエラーを見つけることが出来る。開発時にそれぞれのブロックに answer や put コマンドを入れて、そのコードが実際に実行されているかどうかを調べることが出来る。そしてスタックが完成したらそのコードは取り除く。

 Revolution は、Starter Kit を使ってパワフルなアプリケーションを作る、独特な機能を持っている。ちょっとした工夫で Starter Kit の制限は乗り切ることが出来、少しばかり複雑なアプリケーションも作ることが出来る。忘れないで欲しい。解決方法はいくつもある。そしてその最善の方法を選択するには、練習あるのみである!



邦訳/文責:UDI
2002.10.14
2003.01.03

inserted by FC2 system