2009-06-12[n年前へ]
■Mathematicaで「オブジェクト指向風」記述
春過ぎの頃、「分光スペクトル・色処理用のMathematica 7.0用ライブラリ」を作りました。そのライブラリを使うと、たとえば、D65光源下で、赤紫色の絵具を重ね塗りしていく際の色変化を CIE Lab 空間のグラフで表示させると、
labPlot[ Map[lab,Table[ transmissionSpector[D65, magentaFilter, d], {d,0,10.0,0.1}] ] ];というようなコードになります。labPlotという名前の関数が一番外側にいて、その内側にMap関数がいて、さらにその引数のひとつにTable関数がいて、その内側にtransmissionSpectorがいて・・・、という風に関数・括弧で外側から包まれているような具合の書き方になります。
こういう書き方をしていると、括弧の対応がわからなくなったり、処理の流れがわからなくなったりしてしまうように感じることがあります。そんな時、気分転換がてら、Mathematicaのコードを「オブジェクト指向風」記述で書き直したりします。どういうことかというと、たとえば、こんな関数を定義してやります。
Light[new]:=Module[ {Spector=D65, self}, self[setSpector,spector_]:=(Spector=spector;self); self[spector]:=Spector; self]すると、
a=Light[new][setSpector, D65][spector][600]というように記述をすることができます。これは、スペクトル属性を持つ「光オブジェクト」をつくり、そのスペクトルをD65光源と同じにし、そのスペクトルの600nm波長の強度をaに代入する、という内容です。最初の例のような、括弧で多重に囲われているのではなく、括弧が連続しているので、括弧の対応や処理手順がわかりやすくなっています。
コードのミソは、「Module内で宣言した(一意に識別できる名前が付けられる)変数self」により、オブジェクトを表現している、というところです。また、selfを返す関数を作ることにより、Light[new][setSpector, D65][spector][600]という風に処理を連ねていくことができるわけです。
もちろん、こういう「オブジェクト指向風」記述をわかりやすく感じる時もあれば、そうでない場合もあるわけで、状況によって、あるいは、その時の気分で好きな風に書く、のが趣味プログラミングとしては一番楽しいような気がします。