スクラッチは文法を覚える負担が少ないですが、それでも細かいルールが意外とあります。
このページでは初心者が初めから知っておいた方が良いルールについて説明します。
ブロックの形と意味を知ろう!
スクラッチの画面の左側にある「ブロックパレット」部分を見てください。そこにはたくさんの種類のブロックがありますね(下図の②)。
これらのブロックは、プログラミングの部品たちです。つまり命令や値を表します。
大まかに次の6種類の「形」があります。
No | ブロックの形 | 形の代表例 | 説明 |
1 | ハットブロック | プログラムの開始を表します。 長方形で上にかまぼが付いたような形です。下の出っ張り部分は、スタックブロックやC型ブロックをつなげる事ができる、という意味です。 |
|
2 | 値ブロック | 数または文字を表します。 丸みのある形(円を横に伸ばした形)です。数と文字を組み合わせて、新しい数や文字を作ることもできます。 |
|
3 | 真偽ブロック | 条件や比較の式を表します。 また、プログラムを実行すると式が評価され、その結果である「真(正しい、true)」または「偽(間違い、false)」の値が、式全体の最終的な値となります。 角の尖った形(ひし形を横に伸ばした形)です。比較の式と式を組み合わせて、新しい比較の式を作ることもできます。 |
|
4 | スタックブロック | コンピューターへの命令(機能)を表します。 長方形の形です。上の凹みや下の出っ張りは、上下にスタックブロックやC型ブロックなどをつなげる事ができる、という意味です。 値ブロックや真偽ブロックを当てはめて使うものもあります。 |
|
5 | C型ブロック | プログラムの実行順序を変える役割をします。 外見はC型またはE型のシルエットです。 真偽ブロックをはめ込んで、処理順を決める条件を指定します。なおかつ、C型ブロックの中にスタックブロックをはめ込んで、条件ごとの処理を指定します。 詳細は「制御の基本3要素」をご参照ください。 |
|
6 | キャップブロック | プログラムの終了を表します。 一見すると、スタックブロックに似ていますが下の出っ張りがありません。これより下にはブロックを追加できないためです。 |
※このサイトでは「スクリプト」と「プログラム」は同じ意味で使っております。
ブロックの形そのものが文法!?
上の表で見たように、ブロックの形は、ブロックの役割を表しています。
それだけではありません。実は、他のブロックとの依存関係(文法)をも「形」で巧みに表現しています。
どういうことかと言うと、お互いに形が「はまる」ものだけを組んでいけば、プログラミング言語の文法が自然に守られるということです。
このようにスクラッチでは、文法をブロックの形で表現しています。
「文法に合う、合わない」⇔「形がはまる、はまらない」
これによりプログラミングのミスが起こりにくいように工夫されています。
スクラッチは、ノーベル賞受賞者を80人以上輩出している、あのマサチューセッツ工科大学です。言語の文法をこんな新しい形に変えてしまったのですから、その発想は本当に素晴らしいですね。
代入した値と式の結果
値ブロックや真偽ブロックは、それ自体が値です。さらに、それらを組み合わせて、より複雑な「式」を作る事ができます。
ブロックや式の値は、プログラムを実行した時に決まります(コンピューターが確かめます)。
そのとき、式の中にあるブロックから順に式が評価されて、最終的に式全体の値が決まるようになっています。
式の値が中から決まっていく様子について、具体例で見てみましょう。
下に2つの例を示します。ブロックを組み合わせる前と後の状態を、それぞれ上下に並べて比較してあります。
上の図で、まず左半分から説明します。
値ブロックの【現在の年▼】は2020です(執筆時点)。
それと真偽ブロック【 〇 > 〇 】を組み合わせて、2019よりも大きいか否かを判定する式を作ったのが、その下です。
2020>2019は正しいので、式全体では真(true)になったことが分かります。
続いて、上の図で右半分についてはどうでしょう。
キーボードのスペースキーを押している状態で実行すれば、真偽ブロック【(スペース▼)キーが押された】の値は真(true)です。
それと真偽ブロックの【<>ではない】を組み合わせて意味を反対にする式を作ったのが、その下です。
もともと真(true)だったものを反対にしたので、式全体では偽(false)になったことが分かります。
もう少し複雑な式ではどうでしょうか。下のプログラムを考えましょう。
上の図では、次の手順でプログラムを作りました。
- 値ブロック【〇+〇】にそれぞれ1を代入して【1+1】という式にする。
- 値ブロック【〇と〇】に上の式と「は整数です。」を代入して、【【1+1】と「は整数です。」】という式にする。
- スタックブロック【〇と言う】に上の式を代入して、【【【1+1】と「は整数です。」】という】にする。
最終的には、見た目に1行のプログラムになります。しかし上の1~3のすべてが押し込まれた、意味深い1行です。
この状態でプログラムを実行すると、1→2→3の順番に値が決まっていきます。つまり、
ブロックに別のブロックを当てはめた場合は、中のブロックから順に結果が決まる!
ということです。
このように、値ブロックや真偽ブロックを使う時は、次の3点に注意することが大切です。
- ブロックに入れる値
- ブロック自体が表す値(結果)
- 処理の順番(内側から結果が出る)
できるけど、やってはいけないパターン
スクラッチは、ブロックの形さえ組み合えば、ブロックとブロックの間の文法は、ちゃんと守られていることになると説明しました。
ただし例外があります。
「型」は合うけど「意味」が合わない、という不具合(文法エラー)
具体的には、主に次の2つのパターンです。
- 数字のつもりで文字を代入してしまった
- 値ブロックの場所に真偽ブロックを組み込んだ
順に説明します。
数字のつもりが文字だったエラー
最初に下の例を見た方が早いです。
一見すると全く同じプログラムに見えます。しかし上は動きますが、下は動きません。なぜだか分かりますか?
【〇秒待つ】というスタックブロックに指定した「時間」が、ほんの少しだけ違っていました。
正しく動いた上の方は、半角(英語モード)で「1」と入力していました。スクラッチでは、半角(英語モード)で数字を書けば、それは数と見なされます。
一方、動かなかった下の方は、全角(日本語モード)で「1」と入力していました。スクラッチでは、全角(日本語モード)で数字を書くと、それは数ではなく、文字だと認識されてしまいます。
半角にすべきところを全角にして動かなくなった・・・よくあるミスです。しかし、全角も半角も似ているので、なかなか気が付きません。そこで、次のように注意しておくしかないです。
正しいプログラムのはずなのに動かない時は、全角で数字が入っていないか要確認
<>を〇には当てはめたエラー
スクラッチは形の違うブロックどうしは、当てはめる事ができません。しかし1つだけ例外があります。
- <>型の真偽ブロックは、〇型に当てはめることができる
- しかし逆はできない(〇型の値ブロックを、<>型に当てはめることはできない)
型が違うのに、真偽ブロックを〇形に代入できてしまうため、そうした間違いが起こりやすいです。
具体例を見てみましょう。
上の例は、全て〇型の値ブロックを使っています。〇型のブロックを〇型のブランクに当てはめていうるのですから、まったく問題ありません。式全体の値は「2は整数」となり、ちゃんと意味が通ります。
一方、下の例は、期待通りに動きません。型の違う真偽ブロックを〇型のブランクに当てはめたからです。式全体の値は「falseは整数」という意味不明な結果になってしまいました。
<>は〇に代入できるけど、間違えるリスクを用心する!
リスクがあるなら代入できないようにすべきと思いますが、そうはできません。
なぜ、上だけが例題として認められるのでしょうか?
それは、そうしたくなる時が、たまにあるからです。
次のように組み立てたプログラムの実行結果は、ちゃんと文脈として成り立ちます。
このように、真偽の判定結果を文字として表示したい文脈の時は、ちゃんと正しいプログラムになります。
もっとも真偽ブロックの値 true や false は英語なので、日本語の文章では、ちょっと使う機会がないかもしれません。
ということで、ほとんどの場合、<>は〇に代入する必要性はありません。できるだけ避けましょう。
さて「意味が合わない」という不具合の典型パターンを2つ見てきました。
他にもあるかもしれませんが、入門レベルなら、これくらい知っていれば十分です。
そして、これくらい細かく注意してプログラミングができるようになれば、中級までの成長が早いと期待できますよ!