Elmで青春のフラクタルを描画する【Elmアドベントカレンダー2014 6日目】

これはElm Advent Calendar 2014の6日目です。

Elmの優れた点と言えば、

  1. Haskellベースの静的型関数型言語
  2. Functional Reactive Programming
  3. 強力なレイアウト機能

などがまず挙がるでしょう。しかし、

  1. 図形描画ライブラリ

も、実はElmの長所の一つなのです。

Elmの図形描画機能

まずは 公式サイトの例をご覧ください。

HTML5Canvasは、JavaScriptによる手続き型の実装を前提にしていたので、コマ毎にclearRectで消去したり、save/restoreで状態を管理したりする必要がありました。プログラマーはともかく、「学校で習った図形を書いてみよう」と言う場合にはやや非直感的です。

一方Elmでは更新処理自体はElmがやってくれます。 また、図形はFormという「図形そのもの」を表す型として、 図形の移動や拡大縮小はmove scaleといった関数として、自然に表現できます。

なお、注意点とがあり、collage w h forms でw×hのキャンバスを作ったとき、原点はキャンバスの中心で、Xが大きくなるほど右、Yが大きくなるほど上の座標です。つまり、数学と同じ座標なのです。

フラクタルを書いてみる

図形が描ける、ならば初めにフラクタルを描くものと相場は決まっています。再帰呼出し&縮小+移動で、シェルピンスキーのギャスケットを描画してみました!

Sierpinski gasket with Elm

n = 0では単なる三角形を、n > 0では自分自身の縮小コピー×3を描画しています。

なお、Elmでは小さすぎる図形(1ピクセル未満?)は描画してくれないらしく、上の例で再帰が深すぎると何も表示されなくなりました。

自分語り&妄想:Elmは未来の十進BASIC

フラクタルを書いていると、十年前私がまだ紅顔の少年だった頃を思い出します。

私がプログラマーになったのは図書館から↓の本を借りたのがきっかけでした。

当時は悪名高いMicrosoft Visual Basicがボロクソに言われつつも全盛の時代でしたが、十進BASICVBとは全く別の"Full Basic"という規格に沿った教育用BASIC環境でした。

教育用だけあって

と、初心者用の機能が充実しているだけではなく、

  • 数値は10進小数がデフォルト(2進数モードもある)
  • 10進1000桁モード(数値型が小数点以下1000桁まで格納可能になる)
  • 有理数モード
  • 複素数モード
  • 強力な図形描画機能
    • function文とは別に、図形を定義するpicture文がある
    • scale, rotate, shift, 任意のアフィン変換, それらの合成変換
  • グラフ描画用関数
  • 図形関連の豊富なExample(含シェルピンスキーのギャスケット)

等など、数学用の機能がとても充実していました。

言うまでもなく、構造化プログラミングにも対応しており、良いプログラミングを教われなくなったり完膚なきまでに壊れることもありませんでした。

さすがに今では、プログラマー志望の高校生にはPythonあたりを薦めます。 でも、数学者・科学者志望だけどプログラミングの素養を身につけたい高校生ならば、今でも10進BASICを薦めたいと思います。(高校生の知り合いはいないけど)。

一方Elmですが、Playground、デバッガ、図形ライブラリなどは既にかなりの充実度です。 このまま発展すれば21世紀版・十進BASIC的な地位に着けるのではないか? と、ガスケットを書いていて思いました。

あとがき

おかげさまでElm Advent Calendar 2014は今のところ途切れず続いていますが、まだまだ空きがあります。ふるってご参加ください。

フラクタルで描く 魅惑的な画像の世界

フラクタルで描く 魅惑的な画像の世界