Edition」の初級から中級のチュートリアル。ドラフトを公開しています。このチュートリアルは、中学・高校生からプログラミングが始めての方達を対象にして、Mac&Winのアプリを同時に作ります。前章の「足し算クイズ」を「足し算・引き算クイズ」に作り替えます。ビルトイン・ファンクションの説明の後、カスタム・ファンクションの作成と使用法。メッセージの伝わり方と、プライベートと言う事。オーナーとターゲットについて。カスタム・コマンドを作って、同じスクリプトで違うグループの解答を調べます。リピートで繰り返して、3問出題の問題を1回のボタン・クリックで作ります。この章では、カスタム・ファンクションと、カスタム・コマンド、それとリピートの基本を学ぶのが主な目的です。LiveCodeのプログラミングは、日常英語のような簡単な言い回しで、コンピュータと会話できるコードを、順序立てて自分で組み立てられるかの訓練です。公式のように言い回しは厳密に覚える必要はなく、必要なら調べ直せば良いと思うくらいの軽い気持ちで進めてください。どんな方法でもうまく動けばそれが正解です。カスタム・ファンクションも、カスタム・コマンドも、もともとLiveCodeにビルトインされている言葉と形の上ではそう違いはなくて、それが自作できるようになっています。コードを書くのが少し慣れてきたら、小さな単位でも、まとめてファンクションやコマンドにして行くような習慣が必要かもしれません。して行けば、カスタム・ファンクションや、カスタム・コマンドの便利さも分かって、プロジェクト全体の流れを見ながらコードを書いて行く習慣も出てきます。足し算・引き算クイズ前章のスタック「足し算クイズ」に、引き算も加えて「足し算・引き算クイズ」にします。始めにプラス記号のあるテキスト・フィールドの名前(Name)を「plusMinus」にしてください(下図)。算数問題を作る時にランダム(random)を使って、このテキスト・フィールドの記号を「+」または「-」に変えます。前章で使った「足し算クイズ」のボタン「問題を作る」のスクリプトを見てみます。スクリプト中「--」の付いた日本語は説明(コメント)です。mouseUpこのスクリプトのどこかの行に、ランダム(2)で得た数字で「プラス」か「マイナス」かを割り振って、フィールド「plusMinus」に入れれば良い訳です。その部分を赤で最後に書き加えます。mouseUp赤文字だけの説明です。「1」か「2」の数字をランダムに発生させて、ゲット(get)で「it」の中に取り込みます。「it」が「1」ならばフィールド「plusMinus」にプラス記号、そうではなく(else)「2」ならばフィールド「plusMinus」にマイナス記号を入れます。1行づつ読んで行けば、そう難しい英語ではありません。これで「問題を作る」スクリプトはできました。ボタン「問題を作る(question1)」のスクリプト・エディター中に書き込みます。今度は、前章で作った「足し算クイズ」のボタン「答えは?(tAnswer1)」のスクリプトを見てみます。スクリプト中「--」の付いた日本語の行は説明(コメント)です。mouseUp「足し算クイズ」ですから、足し算の場合だけを考えています。青文字にしているスクリプトは、プラス記号にだけ対処してあるので、「足し算・引き算クイズ」では、if文を使ってプラス記号の場合とマイナス記号の振り分けを作り、さらにそれぞれの正解、不正解のスクリプトを作ります。if文でプラス記号の場合と、マイナス記号の場合に対処した部分だけを書きます。「--」の後の日本語は説明(コメント)ですが、スクリプトに書き込む時は削除してださい。スクリプト・エディターの中に日本語は書き込めません。7はスクリプト・エディターの中に日本語のコメントが書き込めます。ここにはマイナス記号の場合のスクリプトが来ます。ifプラス記号の場合の青文字はそっくりそのまま前回のスクリプトです。マイナス記号の赤文字は、青文字のプラスがマイナス記号に変わっただけです。この上にあるスクリプトを、ボタン「答えは?(tAnswer1)」のマウスアップ・ハンドラーを含めて全部書きます。mouseUp赤文字部分には「if」で始まる文が3つあります。if」が赤文字の最後の行に来ています。if」で終わっているかを確認しながらコードを書いて行くのは、とても重要です。カスタム・ファンクションを作るスクリプトを書き換えて「足し算・引き算クイズ」になりました。command)」を作ります。現在のままでも機能としては働きますが、違う形に整理して、もう少しプログラミングらしさが使えるようにします。statement)に組み込まれます。LiveCodeにはビルトイン(buit-in)・ファンクションと言うのがもともと用意してあって、これまでにも「random」や「isNumber」などのファンクションを使ってきました。ビルトイン・ファンクションは、2通りの表記ができます。ある値」のような形を取ります。ある値」のようなパラメータ(parameter)はありません。カッコ(ある値・状態・パラメータ)カッコ閉じる』のようにも書く事ができます。「date()」のようにパラメータ(parameter)を取らないファンクションのカッコ内は、空白になります。カスタム・ファンクションは、ファンクション・ハンドラーと言われる形を取って、その意味の内容から返す事柄・値を決めます。これをファンクションを定義(definition)すると言っています。parameter」が来ます。ファンクション名(始まりと同じ名前)」で終わります。この下にカスタム・ファンクションの型を書きました。ある値」に相当する、ファンクションを実行する際に指定で変わる値です。パラメータがないカスタム・ファンクションも、幾つも使うカスタム・ファンクションもあります。具体的な文面を見た方が分かりやすいでしょう。「足し算・引き算クイズ」のボタン「問題を作る(question1)」に、この章で作った新しいスクリプト部分を「plusOrMinus」と言う名前のカスタム・ファンクションにします。このファンクションにはパラメータはありません。赤文字の行がカスタム・ファンクションの定義です。if緑文字で書いてあるのは、上で作った「足し算・引き算クイズ」で使ったスクリプトです。(ファンクション名)」が入っている事と、「retrun」でプラス記号かマイナス記号を返しています。ない方は、フィールドの中に直接記号を入れています。ある値」を使った、英語表現はできません。ステートメントの中でカスタム・ファンクションを使うのを、LiveCodeではファンクションを呼び出す(Call)と呼んでいます。下の例ではカスタム・ファンクションを一カ所だけで使っていますが、カスタム・ファンクションの利点は、短い言葉で同じ処理の情報を何カ所にも使うことができたり、定義の修正だけで、呼び出されたファンクション全てを一度に修正ができる利点があります。以下が、ボタン「問題を作る(question1)」に入れる、カスタム・ファンクションを使った全部のスクリプトです。「--」の付いている日本語は説明(コメント)ですから、スクリプトで使う時は削除してください。スクリプト・エディターに日本語は書き込めません。plusOrMinus図1:エディター(左にオブジェクト内のハンドラーの一覧、右は書かれたスクリプト)図2:呼び出しているファンクション名からコンテキスト・メニューを出す上図はどちらもボタン「問題を作る(question1)」のスクリプト・エディターです。図1は、左のハンドラーの一覧からハンドラー名をセレクトすると、右にあるそのハンドラー名が選ばれます。図2は呼び出しているファンクションからコンテクスト・メニューが出ますから、そのファンクションの定義(definition)がどこにあるかを見つける時に使います。ここでは一つだけのファンクションですが、数が増えて来ると非常に便利です。この例では定義(definition)しているファンクションと、呼び出されて使われているファンクション(ファンクション名+カッコ)とが、同じオブジェクトの中にあります。幾つものオブジェクトから、ひとつのファンクションを呼び出すようにするには、マウスアップ等のアクションが、メッセージとしてLiveCodeのエンジンに伝わって行くルートの上位に、ファンクションの定義(definition)が置かれていなければいけません。LiveCodeは、もしオブジェクト内にファンクション・ハンドラーが見あたらなかったら、メッセージが伝わるルート(メッセージ・パス)の上位に、ファンクションの定義を探しに行きます。カード上の幾つかのボタンから「plusOrMinus()ファンクション」が呼び出されるとすると、この「plusOrMinus」ファンクションの定義は、ボタンが置いてあるカードのスクリプト・エディターの中か、さらに上位のスタックのスクリプト・エディターの中に書かれていなければいけません。path)と呼んでいます。プライベート「private」グローバル(global)とローカル(local)について話した事と少し似ていて、呼び出されるファンクションが、同じオブジェクト内(ローカル)で定義されているのを、LiveCodeではプライベート(private)と言って、「function」の前にキーワードの「private」を付ける事ができます。これは必ず付けなければいけない言葉ではありません。プライベート(private)を付ける事によって、LiveCodeエンジンが上位階層にカスタム・ファンクションを探しに行く必要がなくなって、それだけ処理スピードを早めます。plusOrMinusプライベート(private)は同じオブジェクト内だけで使えるキーワードですから、メッセージの伝わる別な階層で使うとエラーになります。command)でも使われます。カスタム・コマンドを作るこれもファンクションのように、LiveCode自体に用意されている「create」「set」「put」等のようなビルトイン・コマンドがあります。command)は、日本語で言う「命令語」をカスタムで作ります。ビルトイン・コマンドのような、日常英語のように使える柔軟性はあまりませんが、長い記述のコマンドを、短い言葉に短縮して何度も使う事ができます。コマンド名」で終わります。LiveCodeでもこの伝統的な形のカスタム・コマンドは使えますが、前述のプライベート(private)を使う事もあって、下のようにコマンドを作ります。パラメータ2のように完結する独立した行で記述して、ビルトイン・コマンドのように、「to」や「into」などのキーワードと一緒に、ステートメントの中の言葉として使う事はできません。それでは「足し算・引き算クイズ」でカスタム・コマンドと、プライベートでないカスタム・ファンクションを作ってみます。カード上にボタン「答えは?」を3つ作って、それぞれのボタンから、カスタム・コマンドを使います。このカスタム・ファンクションとカスタム・コマンドの定義は、必ずカードより上位のメッセージ・パスになければいけません。最後にひとつだけの「問題を作る」ボタンで、3問出題できる「足し算・引き算問題」のスクリプトを作ります。1(グループ1)」を作ります。OSはオプション・キー(Windowsはオルト・キー)を押しながら、「グループ1」をドラッグしてコピーの「グループ2」と「グループ3」を作ってください。「グループ1」のボタン「問題を作る(question1)」だけ残して、「グループ2」と「グループ3」のボタン「問題を作る(question1)」は削除します。Group」からでも、どちらからでもできます。グループのナンバーは、階層の下のレイヤーから1,2,3と振られて行きます。最後に作ったグループは、ナンバー「3」です。Position」でナンバー(Number)を変えられます。図:グループ1、グループ2、グループ3カスタム・コマンドを使う「答えは?」の方から作って行く事にしましょう。tAnswer1」のスクリプト・エディターを開きます。Group」をクリックして、ボタンをセレクトするか、ブラウズ・ツールでMacOSなら「オプション+コマンド・キー」、Windowsでは「コントロール+オルト・キー」でターゲットのオブジェクトをクリックすれば、スクリプト・エディターが開きます。mouseUp」だけ残して全てカットして、カードのスクリプト・エディターにペーストします。Script」を選びます。Script」を選びます。tAnswer」の行を書き足します。このカスタム・コマンドの名前は「tAnswer」です。このカードの上にはグループのレイヤーが3つあって、同じ名前のテキスト・フィールドもそれぞれのグループにあります。スクリプトから何かの指示を、同じ名前のオブジェクトに出した場合、最下位のレイヤーにあるオブジェクトと判断されます。それを避けるにはどのグループに、そのオブジェクト(この場合はフィールド)が属しているかがキーとなります。この例ではグループ・ナンバーをパラメータ(parameter)として使い分ける事にしましょう。カードにある「答えは?」の3つのボタンから送るコマンドは、それぞれグループ・ナンバーを差し替えて、カード内にあるカスタム・コマンド「tAnswer」の定義を読み取ると言う事になります。一般的にLiveCodeディベロッパーは、パラメータの定義でどの言葉がパラメータなのか分かるように、頭に「p」の文字を付けて使うことが多いので、それに倣ってここでも「pGroupNum」と言うパラメータにしました。「グループ1のボタン」から送られるときは「1」、「グループ2のボタン」から送られるときは「2」と、差し替えてコンピュータに読まれる事となります。変更部分に1行だけグループ・ナンバーではない行があります。mouseUp」を使うとエラーになってしまいます。top」にし変更ます。tAnswer)も、他の経過中のハンドラー(mouseUp)も、すべての実行を中断させます。カードにペーストしたスクリプトに、新しく書き加えられた部分を赤文字にしています。tAnswer実はもうひとつ解答するフィールドでリターンがされた時、「答えは?」のボタンに「mouseUp」を送るカスタム・コマンドが必要です。こちらは「fldReturn」と言う名前のカスタム・コマンドで、パラメータはありません。パラメータの変わりに別な新しい言葉「target」と「owner」を使う事にします。fldReturn「target」は、クリック等のアクションが行われたオブジェクト名を指します。別な表現では、「メッセージの実行のスタートが受け取られたオブジェクト名を返す」と言う内容になります。ひとつの「owner」のこのスクリプトでの意味は、オブジェクトが属しているグループ名です。オーナー」と言っています。オブジェクト・ハイアラキーとは、上位のオブジェクトのカラーやフォント等のプロパティに、下位のオブジェクトが従う決まりがあります。これについては、そういう事柄があるというだけにここでは留めます。図:2つのコマンドの定義が書かれた、カードのスクリプト・エディター。グループ3のフィールド「tAnswer1」に入れるスクリプト以上をグループ内のそれぞれのボタン「答えは?」と解答欄のフィールドに入れます。リピート「repeat」でループを作る最後に、出題を一度に3問作り出すボタン「問題を作る」に取りかかりましょう。これは「足し算・引き算クイズ」で使った出題と、ほぼ同じスクリプトを3回続けて使って、毎回違うグループのテキスト・フィールドに、数字とプラス・マイナス記号を入れて行きます。リピート」と言う、同じステートメントを繰り返してループを作り出す、コントロール・ストラクチャーを用います。簡単なリピートの説明から始めます。「add」は数字の入っているバリアブル(下の例では「tNumber」。仮に値を入れておくコンテナー)に数字を足して、値を変えるコマンドです。repat」でループから抜けます。何々になった場合(コンディション)」などのループフォルムがあります。終わりの数字」と言うループフォルムを使います。いう場合の「ループ・カウンター」によく使われる文字の「i」にしています。整数」の頭文字をループ・カウンターとして使う慣用的な用法で、「X」でも「j」でもスクリプト中で支障のない文字であれば何でもかまいません。repeat青文字は出題がひとつだけのボタン「問題を作る」にあったスクリプトと同じです。3問出題のボタン「問題を作る」のスクリプト・エディターは下のようになります。問題を作る」の中だけで呼び出されるので、定義に「private」を付けています。if」で終わるか、いつも確認しながら書き進めます。スクリプト・エディターの左のコラムに出るハンドラー名の一覧から、目的のハンドラーをクリックすると、右のステートメントからその定義を探し出す事ができます。スクリプト・エディターの右のステートメントで呼び出されているファンクション名、使われているコマンド名から、コンテクスト・メニューを引き出すと、その定義を見つける事ができます。同じオブジェクト内にあるファンクションに呼び出される、定義しているファンクション・ハンドラーの始めに「privateキーワード」を付けると、処理のスピードが早くなります。path)の上位に置かなくてはいけません。一般的にLiveCodeディベロッパーは、パラメータ定義でどの言葉がパラメータなのか分かるように、頭に「p」の文字を付けて使う事が多いです。hierarchy)によって、上位のオブジェクトのカラーやフォント等のプロパティに、下位のオブジェクトが従う決まりがあります。Script」を選びます。