コメント、あと日記

 委譲だとコメントを移行させるのが大変だ。問題はインテリセンスに表示できるかどうかだ。実際のところのアクセスはinterfaceにまかせてしまう手でいけるかな。interfaceのコメントなら実装が委譲だろうと失われない。ソースファイルがあれば、コメントを移行させることも自動化できるけど、実際にやるにはC#ソースコード解析するしかないんだろうな。Visual StudioAPI使えば出来るのかな。しかしやり方がわからん。実行時型にコメントが残ればいいのに。

 Scalaはまだ使い物にならないようだ。静的型言語である以上IDEがバリバリ動いてくれないと困る。やっぱりC#は生産性高い。オブジェクト指向と関数型と手続き型が交じり合って溶け出すような見事なソースコードが作れる。しかし2chとか見ててもついてけてる奴はあまりいないみたいだな。

 ちょっと前に2chで関数型ユーザーを叩いてみたのだけど、やっぱり関数型の内実は80%ほどが幻想だな、という感想を持った。Lisp,Schemeのユーザーはすぐ折れたがHaskellのユーザーは頑固だった。まあ純粋で美しいから信者になってしまったのだろうけど、純粋な美しさでHaskellに勝てるものはいないだろうと思う。しかし自然言語を目指さず数学的な記述を目指したところでいいプログラムは書けない。数学は定理を証明するための言語で、プログラミングは定理の証明ではない。証明出来るならプログラムなんか書く必要ないしな。

 しかしその煽りあいの中でFunctional Mapというものの存在を知った。今まで知らなかったのだけど、というかWeb上の解説からみつからなかったのだけど、多分二分木とかなんちゃら木とかそれ系統のもので、副作用がない。俺の想像だが、

    A
  B   C
D  E F  G

 この二分木のEの下にHをくっつけたいとする。しかし今Aやその他のノードを参照している他のオブジェクトにはこの変更で影響を受けさせてはいけない。全部コピーして作り直すのが手っ取り早いが、この二分木には副作用がないので、別に全部を作り直す必要はない。書き換えられることがないことがあらかじめわかっていれば、A,B,Eを新しく作り直すだけでいい。

    A'
 B'   C
D E' F G
   H

 C,F,Gの木はそのまま使えるし、Dも使える。新しく作ったA'にはCを参照させ、B'にはDを参照させる。既存の木を出来るだけ使い回せば、log n個のノードのnewで済む。Mapへの追加にかかる時間としては妥当なところだろう。

 まあハッシュテーブルかなんか使った方が速いけど。