「NewtonScriptの文法」
とりあえずレイアウトをしてプログラムを割り付ける手順がわかったところで、NewtonScriptがどういう言語か少し勉強しておきましょう。今回説明するのはNewtonScriptの基本中の基本となる文法ですから、とりあえずテキストで保存しておき、以後プログラムを書く時に改めて読み返して書き方を確認するとよいでしょう。
まず、プログラムの基本形からです。前回作ったプログラムを思い出して下さい。あのプログラムは、このような形になっていました。
func () begin ……命令を書く…… end
次に、変数や演算記号などについての説明をまとめておきましょう。
●変数の宣言について●
さて、プログラミングをする時に不可欠なのが、変数と計算式の記号ですね。NewtonScriptでは、変数は最初に宣言をしてから使い始めます。
local X; local X := 100;
変数を使う時は、このように「local」というものを使って宣言してから使うようになっています。実は、宣言しないで使うことも不可能ではないのですが、そうすると動作速度などの面でデメリットが大きいようです。ですから「必ず宣言して使う」と思った方がいいでしょう。
また、上の式を見てきづいたことでしょうが、NewtonScriptでは、全ての命令の終わりには;記号をつけるようになっています。「ここで命令は終わりですよ」ということをこの記号でわからせているのです。これも忘れがちですから気をつけましょう。
●変数の型と代入について●
変数への値の代入は、「:=」という記号を使います。ただの=では代入はできません。NewtonScriptでは、代入と等号を分けて考えています。:=は代入で、=は両者が等しいことを示す等号として使われるのです。
代入する値は、数字はそのまま、文字列は両側を”記号で括ります。例えば、こんな感じです。
local X := 100; local Y := "ABC";
local X := 10; local Y := "10"; local Z := X + Y;
●演算記号について●
数値の演算で使える記号は、四則演算については「+−*/」を使います。これは一般的ですからわかりますね。
注意すべきは割算です。/の場合は、実数で値が得られます。けれど、「割った整数部分だけ」あるいは「割った余り」などを得たい場合もあります。このような場合には、それぞれ「div」「mod」というものを演算記号として使います。
10 / 3 → 答え: 3.3333... 10 div 3 → 答え: 3 10 mod 3 → 答え: 1
"ABC" & "DE" → 結果: "ABCDE" "ABC" && "DE" → 結果: "ABC DE"
では、実際の命令はどのように書けばいいのでしょうか。これには、いくつかの書き方があります。これは、実行する命令がどのようなタイプのものであるかにより、書き方が変わってくるからです。
●オブジェクトにメッセージを送る●
もっとも重要なのは「オブジェクトにある機能を呼び出す」という場合です。これは以下のような形で記述をします。
《オブジェクト》:《メッセージ》(パラメータ…);
なんだかよくわからないかも知れないですね。−−例えば、ここに「Test」というオブジェクトがあり、「Open ()」という命令をこのオブジェクトで実行させよう、と思ったとしましょう。その場合、
Test:Open ();
このように書くことになります。こうすると、TestオブジェクトにOpen ()が送られ、実行されるのです。
Newtonでは、全ての命令は「メッセージ」という形でやり取りされています。メッセージというのは、一種の信号みたいなものをイメージすればいいでしょう。
NTKでレイアウトを作る時、いくつかのビューを組みあわせていましたね。そしてブラウザを開くと、アトリビュートやサブルーチンのようなものがそのビューに組み込まれているのがわかりました。このように全てのビューには、様々な機能があらかじめ用意されています。
NewtonScriptではオブジェクトに何かを実行させる時、そのオブジェクトにメッセージを送ります。すると、そのメッセージを受けて、それに対応する機能が呼び出され、実行されるのです。
オブジェクトは、そのオブジェクトの名前を指定します。例外的に、「自分自身にメッセージを送る」という場合は、オブジェクトを省略してもいいことになっています。−−例えば、前回ボタンが1つあるだけのパッケージを作りましたね。あのボタンのbuttonClickScriptには、こんなプログラムが書いてありました。
func() begin :Notify(kNotifyAlert,"Alert","Hey, Don't Tap Me !!"); end
●システムの組み込み関数を実行する●
NewtonOSにはあらかじめ便利な関数が組み込んであります。こうした組み込み関数を使う場合は、オブジェクトの指定などは必要ありません。単に、
《関数名》(パラメータ…);
とするだけで実行できます。−−例えば、ある数字の平方根を返す関数「Sqrt()」というものがあります。これを使って10の平方根を得たい場合は、
X := Sqrt (10);
こんな感じで書きます。組み込み関数は、新たに登場したらその都度取り上げて説明していきますので、今のところは「そう言うものがある」とだけ覚えておきましょう。
●アトリビュートを指定する●
オブジェクトのアトリビュートの値などを得て使いたいというような場合は、そのアトリビュートを指定する方法を知っておかないといけません。これは、このように書きます。
《オブジェクト》.《アトリビュート》
例えば、「TextData」というprotoInputLineテンプレートのビューがあり、そこに書かれているテキストを取り出して変数に収めたい、と思ったとしましょう。この場合、
X := TextData.text;
このように書くことで、textアトリビュートの値を変数におさめることができます。ただし、これはアトリビュートを指定するときの書き方です。値を変更する場合は専用の関数を使わないといけないので注意して下さい。同様に考え、
TextData.text := A;
このようにしてもエラーになります。あくまで読み取り専用なのです。
プログラムを書く上でもう一つ重要なのは「制御構文」です。プログラムを制御する方法ですね。これには大別して「条件分岐」と「繰り返し」があります。この2つの基本構文についても説明しておきましょう。
まずは、条件分岐からです。これは一般に「IF文」と呼ばれているものですね。条件をチェックして、正しい場合と間違っている場合で異なる命令を実行させるのに使います。この基本形は、以下のようになります。
●正しい場合に何かをさせる● if 《条件式》 then 《実行する命令》; ●正しい場合と間違った場合に別の事をさせる● if 《条件式》 then 《正しい時の命令》; else 《そうでない時の命令》;
例えば、「Xの値が0以上ならばYを1増やし、そうでない場合はYを1減らす」なんて場合は、こんな感じになります。
if X > 0 then Y := Y + 1; else Y := Y - 1;
問題は、2つ以上の命令を実行させる場合です。こうした構文中で複数の命令を実行させる場合、NewtonScriptは「beginとendの間に挟んで書く」というのが基本になります。
if 《条件式》 then begin ……実行する命令…… end; else begin ……実行する命令…… end;
この「構文内で複数命令を実行する時はbegin〜endでくくる」というのはNewtonScriptの基本中の基本ですから、しっかり覚えておく必要があります。
例えば、「Xの値が0以上ならばYとZを1増やし、そうでない場合はYとZを1減らす」というような場合には、以下のようになります。
if X > 0 then begin Y := Y + 1; Z := Z + 1; end; else begin Y := Y - 1; Z := Z - 1; end;
次に、繰り返し構文へ進みましょう。これにはいくつかのスタイルがありますが、もっとも多用されるのは以下のようなものです。
●変数が開始数から終了数の間繰り返しを続ける● for 変数 := 開始数 to 終了数 do 《実行する命令》; ●繰り返し実行する命令が複数ある場合● for 変数 := 開始数 to 終了数 do begin 《実行する命令》; ………… end;
local X := 0; for i := 1 to 10 do begin X := X + i; end;
さて、これで簡単なプログラムを書くのに必要な文法は理解できたと思います。もちろん、まだまだ知らなければいけないことは山のようにありますが、とりあえずちょっと手始めに何か作るか、という程度であれば十分でしょう。