読者です 読者をやめる 読者になる 読者になる

なんだか

sicp

勉強不足てのはつらいものです。

ああああ、ちょっと昔の記事直しましたはい。

SICPですが1回1subsectionのペースで読み進めることにしました。

ということで、Section1.1をよみました。
内容は基本的Lisp表現についてです。

割と気になった点として、1.1.3-4のdefineとかについてです。
defineとはなんぞやと。
本文中ではspecial formの一つとか言ってますけど、単なる名前の付け替えの手続きとしか見なしていないのか(まあprocedureって言ってますし)、まあいまのところわかりません。
なんといいますか、高階関数とか弄りたいなーとか思うけど、どうやるんですか、とかモニョモニョする感じです。(後でλちゃん使うんですね、わかります。)

あとは評価戦略の話でしょうか。
本文中のExercise1.5にもなっていますが、Lispはnormal-order評価でなくapplicative評価を採用しているため、イレギュラーな計算に対応しない場合があると。
演習の例を引用します:

(define (fact n)
        (if (= n 1) 1 
                    (* n (fact (- n 1)))))
(define (test x y) (if (= x 0) 0 y))

(test 0 (fact 999999))

とかをgoshに食わせます。factは階乗関数です。
すると、止まってくれません。
test関数自体は非常に簡単なもので、(test 0 x)の形は、数学的にはxが何であろうと問答無用で0を返すものになっているのに、です。

これは、applicative評価だと、最終式を評価する際、test関数のargumentのfactから先に計算しようとするからです。
因みに、C言語で同じ計算をすると、ちゃんと0を返してくれましたー。(∩´∀`)∩ワーイ


とまあこんな感じでしょうか
もうちょっと頑張ります。。。


うにゃ