どうでも良い文章が続きます…

どうでも良いのだが、今月の初め頃、大学生協の本屋をふらふらとしていたら
SICPが山積みになっているのを発見した。
何事かと思い近くで見てみるとどうやら今年から
情報学科2回生の授業(アルゴリズムとなんたらかんたら?)の
教科書として採用されたらしい。
あぁ、終に。私は嬉しいよ…。
……んが、なぜ今年から?
これの単位去年取ったのですが…。


しかし、それはそれ、SICPSICPである。
単位のあるなしなど関係ない。SICPフリークを自負する(…嘘です)
私が授業に行かなくてどうするよ。
…ということで、そんな風に決意したはいいが、
今日ようやく3回目にして出席することが出来た。
(やる気無さすぎだ…)


まず、当然のことながら周りが皆SICPを持っていることに圧倒された。
本当に教科書なのね。
教授も仰っていたが、コンピュータエンジニア方面の人から見ると
この本で授業が受けられるのは本当によだれが出るほど?
うらやましいことであるはずだ。
次にこれまた当然なのだが、黒板にS式がずらずらと書かれていく。
なんというか、これは非常に新鮮な感触だった。
なぜだか微妙に嬉しい。
偏見かもしれないが、S式は文字になっていても分かりやすい
ような気がする。Cのプログラムは縦方向?の濃度が薄すぎて
紙に手書きしたりするとあんまり嬉しくない状態になるように
思われるのだが、Schemeのコードだとなぜだが違和感があんまり無かった。
そういえば、私もSchemeの勉強をしていたころは
紙にひたすら色々な関数を書いたような記憶がある。


それで、やっていた内容は
かなり最初のほうの評価方法のあたり。
(…かな?SICP持っていっていなかったからどの辺なのかはよく分からんけど)
どうも先週までSchemeの処理系についての話があった模様。
私は最近Haskellばかりやっていたので、
簡約ステップでちょっと、ありゃりゃ、としたことが。

(define (sum-of-squares x y)
  (+ (* x x) (* y y)))

(define (foo n)
  (sum-of-squares (+ n 1) (* n 2))

上のような定義(だったと思う)で(foo 5)を簡約してみよう、
というところで、まず

(foo 5)
=> (sum-of-squares (+ 5 1) (* 5 2))

となるのはまぁ簡単…というかそのままなのだが、
この次の簡約どうやって表現するんだろう…と思っていると

=> (sum-of-squares (+ 5 1) (* 5 2))
=> (sum-of-squares 6 7)

ああっ、正格評価か!


遅延評価に慣れすぎるとどうも
そっちがデフォルト評価戦略として機能してしまうようである。
(…というか、こんな風になっちゃう人は他に居らんか…)


と、ニュートン法を経て、
(x^2=nなるxを求めるためにはそのようなアルゴリズムが必要、
という実は深いテーマだったりするが)
ifが特殊形式になっている理由の推論へ。

(define (if2 a b c)
  (or (and a b) (and (not a) c)))

これとifとの挙動の違いを示せということである。
(なんか宿題になってたけど…)
これはもちろん評価のタイミングの違いで、
b,cが副作用を含む式であったり、
例外を投げたりするような場合、ifとは違う挙動を示しうる。
例えば、

(if #f (/ 1 0) 1)

こういうことですな。
こういう理由でifは関数として定義できないのだが、
その直接の原因は正格性評価にあるゆえ、
Haskellとかだとifも関数で定義できるはずである。
実際には"なぜか"Haskellのifは関数にはなっていないが
(プログラムから括弧を減らすため?)
確かCleanではifは関数として定義されていたような気がする。
(thenとelse書くのかったるいんだけど…)