(PUKAIの発表資料です。スライドを作る時間がなくて、なんと日記に書いて説明してしまいました)
手順は ぐるぐる 歩く 1 右へ 1 ぐるぐる 終わり
but, 一定回数の繰り返しだけ、repeat(単なるループ)を入れてしまっている。これでは台無し。「子供には再帰」と主張するなら最後までそれを貫かないと...
実際、先生方に話を聞くと、使っていたのはrepeatだけだったらしい。「子供でも再帰」は幻想
(2) データ構造はリストのみ
- 集合も配列も木構造も自由自在。car, cdr, cons相当の命令あり
- しかし、ほとんど使われることはなかったらしい...
(3) スコープはダイナミック
- 古いLispだから...。手続き内のbindされていない変数は、どこから呼ばれるかで意味が変わる
- 最初lexicalで作りかけ、動作が違うので気付きました :-)
(4) 代入はset
-通常の言語の「x=1」「y=x+1」は、次のように書く。Lispのsetそのまま(setqではない)
- しかし、第1引数をquoteする意味を理解している先生にはお目にかかったことがありません...
変数は "x 1 変数は "y :x+1
こんな変体言語が、
・命令を日本語に訳しただけ
・タートルグラフィックスという愛らしい見せかけ
だけで、全国の小中学校の先生と生徒がお絵描きに使っていた
教訓: 「フツーの言語でないと難しい」は幻想!
obj ! args... msg. (例) カメ太!100 歩く。
前の結果のオブジェクトにメッセージを送れる(カスケード)
正確には、最初のメッセージの返値に次のメッセージが送られる
// カスケード obj ! args1... msg1 args2... msg2. (例) カメ太!100 歩く 90 右回り。
カメ太=タートル!作る。 // 代入+メッセージ送信 カメ太!100歩 歩く。 // メッセージ送信
メッセージ送信とカスケードを使って、制御構文を実現
eval: 基本形はブロックオブジェクトのeval。実際にはほとんど使われないが
「...」!実行。
while
「...」!の間「...」実行。 // 「...」!の間 → While // While!「...」実行。
if/then
「...」!なら「...」実行。 // 「2 > 1」!なら → True // True!「...」実行。 // 「1 > 2」!なら → False // False!「...」実行。
if/then/else
「...」!なら「(T)」そうでなければ「(E)」実行。 // 「2 > 1」!なら → True // True!「(T)」そうでなければ → Done // Done!「(E)」実行 // 「1 > 2」!なら → False // False!「(T)」そうでなければ → True // True!「(E)」実行
時計=タイマー!作る。 時計!「...」実行。 // 0.1秒間隔で100回実行(10秒間) ...
タイマーの実行は終了するまでに時間がかかるので(上の例は10秒)、メインの流れとは別スレッドで実行される。つまり、タイマーを実行すると、処理の流れはタイマーの終了を待たずにそのまま次の行に進んで行く。子供たちは知らずにスレッドでプログラムを作っている!
たまには終るのを待ちたいこともあるため、単純な待ち合わせを用意した
時計=タイマー!作る。 時計!「...」実行。 // 0.1秒間隔で100回実行(10秒間) 時計!待つ。
ここまでが言語の話。以下はドリトルの代表的な応用例

カメ太=タートル!作る。 左ボタン=ボタン!”左”作る。 左ボタン:動作=「カメ太!30 左回り」。 右ボタン=ボタン!”右”作る 120 0 移動する。 右ボタン:動作=「カメ太!30 右回り」。 時計=タイマー!作る 200 回数。 時計!「カメ太!10 歩く」実行。 タートル!作る ”tonbo.gif” 変身する ペンなし (乱数(600)-300) (乱数(300)-150) 位置。 タートル!作る ”tonbo.gif” 変身する ペンなし (乱数(600)-300) (乱数(300)-150) 位置。 タートル!作る ”tonbo.gif” 変身する ペンなし (乱数(600)-300) (乱数(300)-150) 位置。 カメ太:衝突=「|相手| 相手!消える」。
これはお絵描きプログラム。上のプログラムで見たように、ボタンは(1)ボタンを作る、(2)押したときの動作を定義する、という2行で書ける。「歩くボタン」「左に曲がるボタン」「三角形を描くボタン」「色を塗るボタン」などを2行ずつ作って行くと、いつの間にか「立派なアプリケーションソフトを作れた!」という達成感を得られる。プログラムは長くなって行くが、いちどに考える部分が2行ずつしかないので、考えるのが苦手な子供でも扱える。中学校までの義務教育では、クラスの全員が扱えることも大切

某企業の新人研修で使われた様子と作品例。カメの姿は画像ファイルを読み込んで変えられる。同級生の写真を切り抜いてロールプレイングゲーム風にした新人もいた。Javaだけを2週間やるのと比べて、ドリトルを2,3日やってからJavaに進むようにしたら定着率が劇的に改善したそうです。プログラミング経験がない場合、初期の段階で「だいたいこう作ればいいんだな」という感触と、「自分はプログラムを書ける」という自信を持たせておくのが重要。いきなりJavaやC++を教えると、示された例題を打ち込んでいるだけの学習(キー入力の学習)に陥りがち

衝突イベントは、ゲームに便利。ここではブロック崩しの例で考えてみる
V1: 動いたオブジェクトに衝突が発生。ボールの衝突の中で、ぶつかった相手を判別して、「パドルと壁なら跳ね返るだけ。ブロックなら、相手を消して得点を加える」という条件処理をする必要があった。複雑で難しい
V2: ぶつかった相手にも衝突が発生。ボールは「何かにぶつかったら跳ね返る」だけでよく、ブロックに「自分を消して得点を加える」という処理を書く。処理が単純になり、プログラムが大幅に簡単になる

これくらいの内容がドリトルプログラムの基本形。小中高の授業ではプログラミングにそれほど時間を使えないので、数時間でプログラミングの楽しさが伝わることを目指している




メロディ!"ドドソソララソー" 作る 演奏。
