03. SNAP! でオブジェクト指向(2/2)

概念・用語:

日本語の解説サイト http://snap.wp.xdomain.jp/ Snap!で遊ぼう

■SNAP!

Scratchに、ブロック作成機能を加えたプログラム学習環境。

http://byob.berkeley.edu/

SNAP!マニュアル

関数定義が可能。

ブロックの制御でパラメータの利用や再帰呼び出しもプログラム可能。

※ 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)

関数ブロックの定義:

SNAP!マニュアル

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にアップロードする。