※この記事は会話形式にリライトしました。
こんにちは、ロブスタのハルです!
前回の講座では演算と演算子について説明しました。
今回は文という概念とプログラムの簡単なデバッグ、補足に使うコメントについて説明していきます!
前回の講座を見ていない方はこちらからご覧ください。
文とは
――ある日の会話――

先生、プログラミングにはテストやコメントを上手く使うことが大切だと書いてある記事を見つけました。

そうですね。プログラミングは常にコードを書いてテストを行い、エラーを修正する作業の繰り返しですから。

テストとかコメントの意味はなんとなくわかるんですが、
実際にどうやって実施するんでしょうか?

テストとコメントについてですね。
それではまず文という概念について見ていきましょうか。
解説
この講座の第1回目でプログラミングは命令であると説明しました。
これはその通りなのですが、例えば次のような状況を考えてみてください。
ロボットに家から学校までの道を案内するとします。
①まずは玄関のドアを開けて
②前に5歩進んで
③左に100m進んで
④右に300m進んで
⑤左に200m進んで
⑥正門をくぐってそのまま昇降口に進んで
今回の例はかなり省略していますが上のように命令を出すと思います。この場合①~⑥全体を指して命令と言えますが①だけでも命令と言えますよね。つまり、①~⑥全体はそれぞれ6つの命令が集まったものと考えることができます。
これをプログラミングで考えたとき、それぞれ6つの命令のことを文といいます。また、文の集まりをプログラムといいます。
多くの言語では文の終わりに;をつけて1つの文をわかりやすくしていますが、Lua言語には文の終わりを示す記号がありません。そのため、どれが1つの文なのかを見極める必要があります。
文の見極め
local num1 = 12
local num2 = 34
local ans = 0
local addNum = 0
local condition = false
ans = num1 + num2
print(ans)
condition = ans > num2
and num1 < num2
print(condition)
addNum = 1 + 2 + 3 + 4 + 5
+ 6 + 7 + 8 + 9
さて、上のコードを見てどれが文なのかわかりますか?
まず、1~5は変数の宣言と初期化をしているので宣言文と呼ばれることがあります。
続いて7・8・11行目はそれぞれ代入文とprint文です。
では、9・10行目はどうでしょう?
一見するとどこまでが文かわかりにくいですが、実は9・10行目は合わせて1つの文になっています。これはans > num2という条件式とnum1 < num2という条件式をand演算子で繋いだ結果をconditionに代入しているためです。
同様に12・13行目も1~9までを足した結果をaddNumに代入しており、合わせて1つの文となっています。
基本的には文は途中で改行せずにつなげて書いていきますが、見づらい場合などには今回の例のように改行することもあります。その場合はどこまでが1つの文なのか考えて読み解く必要があります。改行の際には9・10行目の書き方ではなく、12・13行目のようにスペースを空けるようにすると見やすくなります。(Roblox Studioのエディタでは自動でスペースを空けてくれます)
コメントについて
――ある日の会話――

これまでプログラムと呼んでいたものは実は文の集まりだったということですね。

ええ、そうなんです。
例えるなら日本語や英語が単語の集まりでできているのと同じですね。

その例えはしっくりきました。
それで、コメントの方法はどうするんですか?
解説
ソースコード中にコメントを書きたい場合は次の2つの方法をとることができます。
-- ここから行末までがコメントです。
--[[
複数行をまとめて
コメントにするときは
このように書きます。
]]--
コメントは簡潔に書くのが基本です。例えばその関数の簡単な説明に使われることが多いです。
変数にもコメントを付けたくなる気持ちはわかりますが、あまり好まれません。
それよりも変数の名前で役割が判断できるように名付けましょう。
簡単なデバッグ
print文とコメントを使うことで簡単なデバッグを行なうことができます。
デバッグとはプログラムが予想外の動作をしたときにその原因を調べて修正することです。
-- 例 本当はtrueがでるようにしたい
local a = 1234
local b = 2938
local ans = 0
local flag = false
ans = b - a
flag = ans > a and a + ans > b
print(flag)
この例ではまず、ansの値がどうなっているかprint文を使って調べてみたいと思います。
-- 例 本当はtrueがでるようにしたい
local a = 1234
local b = 2938
local ans = 0
local flag = false
ans = b - a
print("ans = ", ans)
flag = ans > a and a + ans > b
print(flag)
これを実行するとans = 1704であることがわかりました。
flagの値がtrueであってほしいのですが、falseになっていることからflagの計算式に問題があると考えられます。そこで、ans > a と a + ans > b にわけてそれぞれがどうなっているか調べてみましょう。
-- 例 本当はtrueがでるようにしたい
local a = 1234
local b = 2938
local ans = 0
local flag = false
ans = b - a
print("ans = ", ans)
print("ans > a : ", ans > a)
print("a + ans > b : ", a + ans > b)
flag = ans > a and a + ans > b
print(flag)
実行してみるとans > aはtrueでしたが、a + ans > bはfalseでした。and演算子がtrueになるにはどちらの条件式もtrueでなくてはならないのでa + ans > bの条件式が間違っていることになります。例えば、a + ans >= bやa + ans == bのように書き換えるとflagの結果をtrueにすることができます。
今回の例ではprint文を使いましたが、後に出てくる関数などを使う際や実際にコードを試し書きする際にはコメントアウトという手法を使うこともあります。これに関してはまた別の回で紹介したいと思います。
最後に
――ある日の会話――

今回はプログラムが文の集まりであることとコメントの書き方を学びました。

特に文はどこからどこまでなのかを見極めるのが重要ですね。
まとめ
- 文とはプログラムにおける処理の単位
- 1行だけをコメントにしたい場合 –を先頭につける
- 複数行をコメントにしたい場合 –[[コメント]]–のようにする
- デバッグにはprint文やコメントアウトを使う
お疲れ様でした。第5回はここまでです。
次回はオブジェクトとプロパティについて説明します。
次回からいよいよ実践的なプログラムを書いていくので今回までの内容をしっかり復習しておいてくださいね。
コメント