SICP 1.1.3〜1.1.6

1.1.3 組合せの評価

なんだろう。。日本語が難しい。。日本語プリーズ。
何言ってるんだ・・和田英一ってだれよ。
http://ja.wikipedia.org/wiki/%E5%92%8C%E7%94%B0%E8%8B%B1%E4%B8%80
ごめんなさい。私がバカなだけっぽいです。尊敬してます。

著者も責められないだろうしなぁ。
でもな〜もっとこう・・リンゴを使って説明するとかさぁ。リンゴとか使うなりさぁ。。

・・・とりあえず大まかに理解して先へ進まないとな。(理解してない)

1.1.4 合成手続き

「手続き」って単語が多い気がする。ようするに演算子か。+とか*とかか。ふむ。

「抽象のそこそこの手段である。」へ、へぇ。そこそこっすか。

(define (square x) (* x x))

これは関数を定義したよってことかな。
「square 2」とかってしたら2乗した答えが得られるわけね。

おおぅ、どうやらそーゆうことらしい。

(square (square 3))
81

なるほど。。

なんだか雪だるま作るみたいだな。
てか例文みる限り普通の話だと思う。

1.1.5 手続き作用の置換えモデル

人間が理解する上でこーやって追っていくんだよ。みたいな話。
でも実際の動きは違うんだぜ坊や。3章と4章で地獄を見せてやる。みたいな話。

置き換えモデルで追っていっても、値がコロコロ変わることもあるわけだから
まぁ、そんな単純じゃないんだぜってことらしい。

「正規順序の評価」と「作用的順序の評価」の違い。
結果的に求められる値は一緒らしいけど、違うときもあるらしい。わけわからん。
問題1.5を見ろとか言われてもifとかまだ習ってないから後でわかるってことかぃ。

1.1.6 条件式と述語

condの話。
って実行しようとしたら昨日コメントで教えてもらった「jsScheme」が無くなってる!!?
どうしたって言うんだっ!!練習できひん!!

・・・仕方ないので環境探し。

SICP勉強会
http://cl.aist-nara.ac.jp/index.php?SICP%CA%D9%B6%AF%B2%F1


Scheme 処理系。MIT では去年までは MIT-Scheme が推奨環境でしたが今年からは DrScheme が標準に変わったそうです。gauche や guile でやっている人もいますが、処理系によって微妙に挙動が違うので注意しましょう。(少し重いですが DrScheme がおすすめです)
どーやらDrSchemeが素敵っぽい。

DrSchemeをゲッツ
http://download.plt-scheme.org/drscheme/

起動。言語を設定しろって怒られる。
「Lazy Scheme」っぽい。
やたー動いたー♪


(define (abs x)
(cond ((> x 0) x)
((= x 0) 0)
((< x 0) (- x))))

実際の動作を見てみる。

(abs 2)
→2

(abs 0)
→0

(abs -9)
→9

ん?9で良いのか?
(- (-9))ってことで+になるってことですか?和田さんっ。
(- x)みたく引数が1つだけだと符号反転を表すってことらしい。ふむ。


(define (test x)
(- x))

(test 9)
→ -9
なるほど。本当らしい。


別の記述方法


(define (abs x)
(cond ((< x 0) (- x))
(else x)))
おぉ。ほんとだ。

condは2パターンの記述方法があるってことか。


さらに別の記述方法


(define (abs x)
(if (< x 0)
(- x)
x))
ずいぶん短くなったけど、ちゃんと動いた。
他の言語で?使ったときのif文みたいだな。

「and」「or」「not」を使用した場合の説明。


(define (>= x y)
(or (> x y) (= x y)))
defineの横には関数名が来ると思ってたけど
そんなの関係なく「>=」を定義することもできるよ。ってことかな。

(>= 4 8)
→ #f
えっ?
falseってことか?

(>= 6 2)
→ #t
どーやらtrueってことらしい。okok。余裕余裕。

問題1.1

さて、問題が出てきました。解答は出てきません。。なめてんの?
なんで解答がないの?

ってか


(if (and (> b a) (< b (* a b)))
b
a)
の結果が
#
なんだけど・・変だよね。約束とかしてないし。
そもそも(define a 3)だけを実行させてもなんの答えも出てこない。

このDrSchemeってエディタ、素敵じゃないのかな。MITの標準って書いてあったのに。

まいっか。もっかいエディタ探し。

ひげぽんさんは「Gauche」を使ってるみたい。
http://d.hatena.ne.jp/higepon/20060415
答えのサイトをみても「Gauche」らしい。
http://oss.timedia.co.jp/show/SICP/ex-1.1

上のサイトで答え合わせすることになりそうなので「Gauche」を使える環境を整えた方が良さそう。

モモンガに入れてみよう。
yum install gauche

ってインストールされなひ。終わった。
なんなの! もうめんどくさいわぁ。
今更Debian入れようとも思わないのでDrSchemeのままで良いかな。

てか「jsScheme」が復活してる。。気まぐれさんだなぁ。。
でもGaucheで走らせた場合と違う答えになってる。
もうね、良しとします。それっぽければ。
「jsScheme」はJavaScriptで作成されてるとのことなのでローカルに保存して使おうっと。


(define a 3)
(define b (+ a 1))
(+ a b (* a b))
(= a b)
(if (and (> b a) (< b (* a b)))
b
a)
(cond ((= a 4) 6)
((= b 4) (+ 6 7 a))
(else 25))
(+ 2 (if (> b a) b a))
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
よしよし。

問題1.2

前置記法ってなんぞ?
http://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95

ほっほぉ。Lispの式っぽく展開しろってことかな。
いきなり難しくないですか・・そうでもないですか。そうですか。
ん〜。

(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
(* 3 (- 6 2) (- 2 7)))

分母が2パターンある気がして困った。
3*4*(-5)にすれば良いのか
(3*4)*(3*(-5))にすれば良いのか。どっちだろう。

答えを見ちゃおうっと
おぉあってる。

問題1.3

なんだろ。定義しろとか言ってる。関数作れってことかな。引数はabcで良いか。
こーゆう場合「cond」を使うのか「if」なのか「and」なのか・・・
わかんねっつの。どれが適してるんだか、どれかでしか実現できないのか。ん〜

cond を使った場合なにかしら条件分岐があって
(else (+ (* a a) (* b b))) みたいなものが来そうなんだけど。

あぁ、式を返却するのであればifは使えないんだな。
じゃぁcondに決定ってことで。


(define (test a b c)
(cond ((< a b) (+ (* b b) (* c c)))
((< a c) (+ (* b b) (* c c)))
((< b a) (+ (* a a) (* c c)))
((< b c) (+ (* a a) (* c c)))
((< c a) (+ (* a a) (* b b)))
((< c b) (+ (* a a) (* b b)))
(else (+ (* a a) (* b b)))))

(test 1 2 3)
=> 13
(test 1 2 2)
=> 8
(test 2 2 2)
=> 8

・・・こんなやり方で良いのか?すごい見づらいよ?
答えを見るのが怖いけど。


(define (sum-of-squares-of-biggers x y z)
(if (> x y)
(sum-of-squares x (if (> y z) y z))
(sum-of-squares y (if (> z x) z x))))
ぎゃーーーー
意味わかんねぇ。

てか疲れたからいったん休憩

(休憩後)
(test 3 2 1)が違うね。そりゃそうだ。orz
また考え直さないと。。