なんだか
勉強不足てのはつらいものです。
ああああ、ちょっと昔の記事直しましたはい。
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を返してくれましたー。(∩´∀`)∩ワーイ
とまあこんな感じでしょうか
もうちょっと頑張ります。。。
うにゃ