Functional Reactive Programming

WPF の binding に驚いた人をさらに唸らせるかもしれない Mathematica の Dynamic - NyaRuRuの日記』の微妙な続き.

Mathematica と Functional Reactive Programming

なるほどー,Reactive Programming というのですかー.国内(?) ではどうも 2003 年末ごろから話題になってた感じ.
一方の Mathematica 6.0 はリリースが 2007 年夏で,2006 年末には国内デモもやってたみたいだし,逆算するとやっぱり 2003 年か 2004 年ぐらいにはこの方向に決めてたんじゃないかなぁ.すごすー
下のページを読んでも,Wolfram の人ら分かっててやってるぽい.

Key Advantages of Mathematica as a Research Language:

  • ...
  • Functional reactive programming extended using the Dynamic construct
  • ...

そこで Excel ですよ

んで,「そこで Excel ですよ!」と言おうと思ったら Lambda the Ultimate のコメントで先に言われてた.

This paradigm is called "nonmonotonic dataflow programming" in this paradigm taxonomy. It is very similar to concurrent logic programming. There is one problem with this paradigm: it introduces "glitches": extra nondeterminism that is not part of the problem specification. An improved version of this paradigm that removes the extra nondeterminism is called Functional Reactive Programming (FRP). It would be nice if Excel could implement FRP (hint to the Excel developers!).

By Peter Van Roy at Fri, 2008-03-07 08:35

ちなみに元ネタは最近話題になっていた Microsoft Excel: Revolutionary 3D Game Engine?
私も最近これを見ていたから Excel のことを思い出したというのはありますけど.

Excel で Reactive Programming っぽいことをやってみる

Excel の「計算方法の設定」はデフォルトで「自動」になっていて,このモードではあるセルを変更したらそのセルに依存していたセルも自動的に再計算.スライダーをセルの値にバインドすればそれっぽく操作してる感じが実現できます.Microsoft Excel: Revolutionary 3D Game Engine? はマクロを使ってビジーループを回しちゃってたせいで,アニメーション中何もできないのですよね.

んが,困ったことに,セルの再計算と再描画ならやってくれるけど,グラフの再計算と再描画はスライダーを離したときになるっぽいようでした.

ちなみにユーザレベルでセルに動的にデータを流し込むには,RTD (Real-Time Data) 関数と COM サーバを使うらしいです.

奇しくも「Microsoft、3月の修正パッチ適用で「Excel 2003」に計算ミス」も RTD 絡みみたいですね.

米Microsoftは14日、3月の月例セキュリティ更新プログラム(修正パッチ)で公開された「MS08-014」を適用すると、「Excel 2003」で計算ミスが生じる恐れがあることを明らかにした。

不具合の影響を受ける可能性があるのは、Excel 2003 Service Pack 2またはExcel 2003 Service Pack 3のユーザー。MS08-014を適用後、Visual Basic for Applications(VBA)から、Real Time Data(RTD)ソースを参照すると、Excel 2003に計算ミスが生じる恐れがあるという。

まあ確かにもともと無茶しやがってな領域でしょうしねぇ.とりあえず今回は RTD 用の COM サーバを作ってうんぬんはやりませんけど,マウス位置とかゲームパッドとかバインドすると面白いんでしょう.これはまた機会があれば.
さて,スライダーの変化に対してグラフの再描画がリアルタイムにならないのが哀しいので,セルの条件付き書式で遊んでみました.


まあこれぐらいならなんとか,というところ.

Excel 2007 で Reactive Programming っぽいことを試してみて分かったことまとめ

まとめ.

  • リアルタイムに値を変更させるのに使える GUI ウィジットが少なすぎる.ラジオボタンとかスライダーとかテキストボックスだけってのは寂しい.Mathematica 6.0 はその点偉い.
  • リアルタイムにグラフの再描画をさせてくれないのが非常にもったいない.多少重くても良いからリアルタイム描画させる方法はないものか.
  • RTD を使うのに COM サーバを登録してもらうってのは不特定多数向けには多分受け入れられない.Excel ファイルさえ配れば良くて,かつマクロみたいにセキュリティにうるさくない形で実現できれば最高.
    • マウス位置とかゲームパッドのボタン状態,CPU やメモリ使用率,RSS 等々色々なものをバインドできそう.

という感じでしょうか.まあなんだかんだで慣れた Excel をベースに Reactive Programming 方向に持っていくのは悪くなさそうな気がします.

Attachment

実験に使ったファイル.Excel 2007 形式.