03. SNAP! でオブジェクト指向(2/2)
概念・用語:
日本語の解説サイト http://snap.wp.xdomain.jp/ Snap!で遊ぼう
■SNAP!
Scratchに、ブロック作成機能を加えたプログラム学習環境。
関数定義が可能。
ブロックの制御でパラメータの利用や再帰呼び出しもプログラム可能。
※ Chrome 使用を推奨
■演習内容
http://byob.berkeley.edu/ から run SNAP! now で、SNAP!のプログラムを作成し、以下の内容を確認。
言語は英語環境になっているので 歯車アイコン から Language を 日本語 に切り替えておくとよい。
ただしテキストは、英語なので、ブロックの作成は英語モードで行うと楽。
復習:
メソッド ローカル変数(スクリプト変数) 関数オブジェクト と 継続
前回の内容に追記した部分を参照(関数オブジェクトについて)
https://sites.google.com/site/kobashijiangyiyong/obujekuto-zhi-xiang/02-snap
部品を組み合わせた造形:
ネタ動画 ビャンビャン麺という漢字 https://twitter.com/aoyagibisen/status/912320067865518080
■関数スタイルのプログラミング(1/3)
関数ブロックの定義:
P.22 ブロック(手続き)の作成
ペンを利用した描画
タートルグラフィックス プログラム学習用言語 LOGO 由来のコマンド型グラフィクス描画スタイル
カスタムブロック(手続き作成)
四角形描画
(応用) 多角形描画
P.24 引数のあるカスタムブロック
四角形のサイズ指定描画
(応用)カスタムブロックを再利用する。
・カスタムブロックをループ処理(回転)するカスタムブロックを制作。 rot_sq
・ 四角形の4つのコーナーを rot_sq で飾る。 rot_sq2
・rot_sqのプログラムを、任意の分割数、任意のサイズ で利用できるように修正した、rot_sq3を作る。
ペンを一旦消去して、上記で作成したコマンドを実行した例)
・関数スタイルのプログラミング(2/3)
関数オブジェクトによるリスト処理
Viscuitで表現した場合:
関数型プログラミングに登場するデータ処理
map と filter と stream をviscuit で表現 http://develop.viscuit.com/3.1/Land.html?path=2518958&name=83&smoothMotion=true&dynamicFile=false
ループを用いないデータ処理
SNAP!の演習
P.27 リストブロック
MAP関数の作成
フィルター関数(オブジェクト) + MAP
http://snap.berkeley.edu/SnapManual.pdf マニュアル、P.25~26 を参照。
・関数スタイルのプログラミング(3/3)
P.25 再帰呼び出し によるフラクタル図形の描画
上記の図形描画ブロックの演習では、
小さな図形ブロック→複数構成→
中くらいの図形ブロック→複数構成 →....
のように、ブロックを階層的に組み合わせて、最終的な図形を描画した。
次の例では、1つの図形描画ブロックだけで、上の例のような複雑な構成の図形を描くことを試みる。
アイディア 木を部品に分解 木→ 幹の枝分かれ →大きな枝の枝分かれ →一回り小さい枝の枝分かれ→・・・・→葉
木は、幹 枝 葉 で構成されている。
葉の無い木 + 幹は太い枝とみなす → 木 は 枝だけで構成されている。
フラクタル図形の描画
再起呼び出しの実行状態)
関数ブロックの作成(モニターの作成)
↓つまらないから、別の例を追加予定。
再帰的定義による関数定義:
例) 階乗計算
関数の作成(モニター)
関数の値(report 値の返却)
追加問題: コンビネーション( n 個 から m 個 を取り出す組み合わせの計算) comb
・関数オブジェクトと関数ブロックの違い
関数オブジェクトの引数を部分適用
今回の演習内容まとめ:
tree ブロックを修正して、フラクタル図形にランダム要素を追加した例)
応用編:
チャレンジしますか?
・高階関数プログラミング P.25 -P. 26
リスト処理
チャレンジしますか?
「継続」を扱うブロックを作成することで、プログラムを制御するブロックを作成することができる。
例) if ブロック for ブロック case ブロック 並列実行ブロック 局所脱出ブロック(jump)
P.49 ~ P.54 継続 継続渡しスタイル(CPS: Continuation Passing Style)
・継続とは(P.49) continuations
処理A → 処理B → 処理C
のとき
(→ 処理B → 処理C) の部分が 処理Aの継続
SNAP!では、 ブロックをリング化することで、処理を1つの 継続 として纏める事が出来る。
継続には、プログラムの記述に加え、実行中の環境(変数の値)も含まれる。
4回ループの処理で、
ループ4回 { 処理A→処理B }
のとき、1回目のループで、 処理Aの 継続は、 (→処理B → ループ3回 {処理A→処理B})
引数のある継続について(P.50)
チャレンジしますか?
・A 継続渡しスタイルプログラミング(CPS) (P.51)
カッコの有る計算式と計算順序
3 * 4 + 5
(3 * (4 + 5) )
4+5 を先に計算して、計算結果に、後から 3を掛け算する。
階乗計算ではどうなるか?
四則演算 を 継続渡しスタイルに変換
・B 継続渡し呼び出し ( Call/ Run w/ Continuation ) (P.53)
例) 継続を引数とし、それを2回実行する twice をブロックで作成し、利用するサンプル。
■プログラムの保存と提出など
2017年度は プログラムエディターを開いて、作成したブロックの内容を表示し、
実行結果をスクリーンに描画し、スクリーンショットの画像で課題提出に変更。
提出方法:
WebClassの第3回課題に SNAP!の今回の演習内容を書き出したXML ファイルをアップロードする。
XMLファイルの作成方法は↓の記述を参照。
今回の課題の提出手順:
1.Fileアイコンから、「プロジェクトを書き出す」を選ぶ。
2.ブラウザのダウンロード領域にXMLファイルとして保存される。
ファイル名: 名称未設定.xml
保存されたファイルをWebClassにアップロードする。