C++でSICP
朝起きたら、西尾さんからこんなのがあったよー、とメッセージが来ていた。
いや、おいらも「Scheme や ML, Haskell で書くんなら boost::bind とか使って書いてもいいよねー」なんて考えた事はありましたが、実際にはまだやっていません。まとまった時間がなかなかとれない*1のもありますが、ソースコードがとんでもないことになるのは目に見えていましたから。特に、SchemeのプログラムをHaskellやMLのような型制約のある関数型言語に一旦介すなんて発想が無かったので、型エラーが発生したさいに吐き出される数万行に及ぶエラーメッセージ(コンパイルタイム計算のスタックトレースとも言う)を追いかけるのは、考えるだけでも恐ろしいのことです。その防衛手段として一旦Haskellを介した発想はすごいと思います。
ところで、関数型言語であるC++は2つの計算シーンを持っています。
- コンパイルタイム
- ランタイム
原理も記法も異なるので混同しないようにしましょう。「C++でSICP」は基本的にランタイムな世界の議論です。おいらが以前書いた純Lispの関数セットはコンパイルタイムの計算だけを使います。そしてどちらもforループを使ったら負けなのです。
*1:そういった意味じゃ、年明け後、成人の日の三連休とそのあとに続くプロシンのラインは貴重かも