GO BACK

NewtonScript教室 その3

「NewtonScriptの文法」



■プログラムの基本形を理解する

 とりあえずレイアウトをしてプログラムを割り付ける手順がわかったところで、NewtonScriptがどういう言語か少し勉強しておきましょう。今回説明するのはNewtonScriptの基本中の基本となる文法ですから、とりあえずテキストで保存しておき、以後プログラムを書く時に改めて読み返して書き方を確認するとよいでしょう。

 まず、プログラムの基本形からです。前回作ったプログラムを思い出して下さい。あのプログラムは、このような形になっていました。

func ()
begin
	……命令を書く……
end

 これが、NewtonScriptのプログラムの基本です。最初の「func ()」というのは、「関数オブジェクト」というものの定義であることを示しています。Newtonでは、プログラムは関数として定義するのです。まあ、ややこしいことは今は理解する必要はありませんが、上の基本フォームだけはしっかり理解しておいて下さい。

 次に、変数や演算記号などについての説明をまとめておきましょう。


●変数の宣言について●

さて、プログラミングをする時に不可欠なのが、変数と計算式の記号ですね。NewtonScriptでは、変数は最初に宣言をしてから使い始めます。

local X;
local X := 100;

 宣言はこのように書きます。どちらもローカル変数(その関数の中だけで通用する変数。当分、変数といえばこのローカル変数であると考えて下さい)を宣言するものです。前者は単に宣言だけしてあるもので、後者は値の代入を一緒にやっています。

 変数を使う時は、このように「local」というものを使って宣言してから使うようになっています。実は、宣言しないで使うことも不可能ではないのですが、そうすると動作速度などの面でデメリットが大きいようです。ですから「必ず宣言して使う」と思った方がいいでしょう。

 また、上の式を見てきづいたことでしょうが、NewtonScriptでは、全ての命令の終わりには;記号をつけるようになっています。「ここで命令は終わりですよ」ということをこの記号でわからせているのです。これも忘れがちですから気をつけましょう。


●変数の型と代入について●

変数への値の代入は、「:=」という記号を使います。ただの=では代入はできません。NewtonScriptでは、代入と等号を分けて考えています。:=は代入で、=は両者が等しいことを示す等号として使われるのです。

 代入する値は、数字はそのまま、文字列は両側を”記号で括ります。例えば、こんな感じです。

local X := 100;
local Y := "ABC";

 変数の宣言を見ればわかるように、NewtonScriptでは、変数には「型」はありません。数字だろうが文字列だろうが、なんでも入れることができるのです。ただし、変数には型はありませんが、値には型はあります。型の異なる値は一緒に計算できません。

local X := 10;
local Y := "10";
local Z := X + Y;

 このようにすると、エラーを起こします。Yは文字列ですから、計算はできないのです。「変数そのものは型はないけれど値には型がある」というのは、つまりこういうことなのです。


●演算記号について●

数値の演算で使える記号は、四則演算については「+−*/」を使います。これは一般的ですからわかりますね。

 注意すべきは割算です。/の場合は、実数で値が得られます。けれど、「割った整数部分だけ」あるいは「割った余り」などを得たい場合もあります。このような場合には、それぞれ「div」「mod」というものを演算記号として使います。

10 / 3	→	答え: 3.3333...
10 div 3	→	答え: 3
10 mod 3	→	答え: 1

 このようになります。わかりますね? また、文字列の場合は、複数の文字列を一つにつなげるのに「&」「&&」という記号を使うことができます。&は単純に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

 ここでは、:Notify()というメッセージだけで、オブジェクトの指定がありません。これは、自分自身にこの命令を送っていたからです。−−まあ、まだ「どのオブジェクトにどんなメッセージに対応する機能があるか」なんて全然わかりませんから、このへんの感覚はよくわからないかも知れません。今のところは「オブジェクトにメッセージを送信すると、その機能が呼び出されて実行されるのだ」という基本概念だけ覚えておけばいいでしょう。


●システムの組み込み関数を実行する●

NewtonOSにはあらかじめ便利な関数が組み込んであります。こうした組み込み関数を使う場合は、オブジェクトの指定などは必要ありません。単に、


《関数名》(パラメータ…);


とするだけで実行できます。−−例えば、ある数字の平方根を返す関数「Sqrt()」というものがあります。これを使って10の平方根を得たい場合は、


X := Sqrt (10);


こんな感じで書きます。組み込み関数は、新たに登場したらその都度取り上げて説明していきますので、今のところは「そう言うものがある」とだけ覚えておきましょう。


●アトリビュートを指定する●

オブジェクトのアトリビュートの値などを得て使いたいというような場合は、そのアトリビュートを指定する方法を知っておかないといけません。これは、このように書きます。


《オブジェクト》.《アトリビュート》


 例えば、「TextData」というprotoInputLineテンプレートのビューがあり、そこに書かれているテキストを取り出して変数に収めたい、と思ったとしましょう。この場合、


X := TextData.text;

このように書くことで、textアトリビュートの値を変数におさめることができます。ただし、これはアトリビュートを指定するときの書き方です。値を変更する場合は専用の関数を使わないといけないので注意して下さい。同様に考え、


TextData.text := A;


このようにしてもエラーになります。あくまで読み取り専用なのです。



■制御構文について

 プログラムを書く上でもう一つ重要なのは「制御構文」です。プログラムを制御する方法ですね。これには大別して「条件分岐」と「繰り返し」があります。この2つの基本構文についても説明しておきましょう。

 まずは、条件分岐からです。これは一般に「IF文」と呼ばれているものですね。条件をチェックして、正しい場合と間違っている場合で異なる命令を実行させるのに使います。この基本形は、以下のようになります。

●正しい場合に何かをさせる●

if 《条件式》
then 《実行する命令》;

●正しい場合と間違った場合に別の事をさせる●

if 《条件式》
then 《正しい時の命令》;
else 《そうでない時の命令》;

 まあ、割と単純ですね。注意するのは、「条件式のあとには;はつかないが、thenとelseの後に実行する命令の終わりはちゃんと;をつけないといけない」ということです。

 例えば、「Xの値が0以上ならばYを1増やし、そうでない場合はYを1減らす」なんて場合は、こんな感じになります。

if X > 0
then Y := Y + 1;
else Y := Y - 1;

 このように、とても単純です。実行する命令が1つならば、です。

 問題は、2つ以上の命令を実行させる場合です。こうした構文中で複数の命令を実行させる場合、NewtonScriptは「beginとendの間に挟んで書く」というのが基本になります。

if 《条件式》
then
	begin
		……実行する命令……
	end;
else
	begin
		……実行する命令……
	end;

 こんな感じです。なんか途端に複雑そうになってきましたね。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;

 これも、繰り返し実行する命令が1つだけの場合は問題ありませんが、2つ以上ある場合はbeginとendでくくります。例えば「1から10までの合計を計算する」というような場合、こんなプログラムになります。

local X := 0;
for i := 1 to 10 do
begin
	X := X + i;
end;

 わかりやすくするために、繰り返す命令は1行ですがbeginとendを使って書いてみました。beginとendの役割さえしっかり頭に入れておけば、あとはそう難しいものではありませんね。

◆    ◆    ◆

 さて、これで簡単なプログラムを書くのに必要な文法は理解できたと思います。もちろん、まだまだ知らなければいけないことは山のようにありますが、とりあえずちょっと手始めに何か作るか、という程度であれば十分でしょう。


GO NEXT


GO HOME