このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

タートルグラフィックス 2

関数型と手続き型が混じったようなプログラミングが出来て楽しい。楽しさを味わうために、forEach, fold, mapReduceと似たような制御用高階関数を準備しよう。

  • repeatEach(配列, 最初にやる関数, 毎回やる関数, 最後にやる関数)

「最後にやる関数」は省略可能で、省略したら何もしない。

repeatEachの引数になる関数の仕様は:

  1. 最初にやる関数() 引数はなし、戻り値は累積値の初期値
  2. 毎回やる関数(配列の項目値, 累積値) 戻り値は次の累積値
  3. 最後にやる関数(累積値) 戻り値は任意。

最初にやる関数の戻り値を初期値とするfoldlと似てる。repeatEach全体の戻り値は最後の累積値。特に最後にやる関数があれば、その戻り値がrepeatEachの戻り値となる。毎回やる関数に配列の項目値と累積値が渡されるが、不要なら使わなくてもいい。

配列のprototypeを細工して、次のようにしてもよい。

  • 配列.repeatEach(最初にやる関数, 毎回やる関数, 最後にやる関数)

最初にやる関数がfunctionでないときでも、そのデータ自体を累積値の初期値として使うようにすると、使い勝手が改善する。それなら、foldlと互換と言ってもいい。

repeatEachに渡す関数でタートルグラフィックスすれば、繰り返しパターンの図形を簡単に描ける。

マルチタートル並列処理が書けるとさらに楽しいが、それはロングレンジの課題。