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
どーやらDrSchemeが素敵っぽい。
Scheme 処理系。MIT では去年までは MIT-Scheme が推奨環境でしたが今年からは DrScheme が標準に変わったそうです。gauche や guile でやっている人もいますが、処理系によって微妙に挙動が違うので注意しましょう。(少し重いですが 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の横には関数名が来ると思ってたけど
(define (>= x y)
(or (> x y) (= x y)))
そんなの関係なく「>=」を定義することもできるよ。ってことかな。
(>= 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
また考え直さないと。。