オンラインSICP読書女子会 #1 (1.1.1~1.1.6)

オンラインSICP読書女子会 #1

これが開催された後から参加したので、私はこの部分を一緒にやってませんがやってみます。

ちなみに私はGaucheではなくてRacketにしました。Emacsでgeiserを使いたかったので、サポートされているものから選んだらRacketになりました。 (ChickenSchemeを最初に試したんですが、分数型をデフォルトで使えないみたいだったのでRacketに変更しました)

練習問題 1.1

10 ;-> 10
(+ 5 3 4) ;-> 12
(- 9 1) ;-> 8
(/ 6 2) ;-> 3
(+ (* 2 4) (- 4 6)) ;-> 6
(define a 3)
(define b (+ a 1))
(+ a b (* a b)) ;-> 19
(= a b) ;-> #f
(if (and (> b a) (< b (* a b)))
    b
    a) ;-> 4
(cond ((= a 4) 6)
      ((= b 4) (+ 6 7 a))
      (else 25)) ;-> 16
(+ 2 (if (> b a) b a)) ;-> 6
(* (cond ((> a b) a)
         ((< a b) b)
         (else -1))
   (+ a 1)) ;-> 16

練習問題 1.2

(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
   (* 3 (- 6 2) (- 2 7))) ;-> -37/150

練習問題 1.3

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

(define (f a b c)
  (max (sum-of-squares a b)
       (sum-of-squares b c)
       (sum-of-squares c a)))
(f 3 4 5) ;-> 41
(f 4 5 3) ;-> 41
(f 5 3 4) ;-> 41

練習問題 1.4

(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))
(a-plus-abs-b 10 -10) ;-> 20
(a-plus-abs-b 10 10) ;-> 20

練習問題 1.5

(define (p) (p))
(define (test x y)
  (if (= x 0) 0 y))
(test 0 (p))

適用順序評価の場合

この場合、以下のような実行結果になることが予想されます。

(test 0 (p))
(test 0 ((p)))
(test 0 (((p))))
(test 0 ((((p)))))
(test 0 (((((p))))))
...

適用順序評価の場合、 test 関数が展開されるよりも先に引数である (p) が評価されるため、無限ループに陥いります。

正規順序評価の場合

(test 0 (p))
(if (= 0 0) 0 (p))
0
  1. 正規順序評価の場合は (p) が評価されるよりも前に test 関数が展開されるはずなので、展開形となり if 特殊形式を含んだ式になります。
  2. if 特殊形式の評価規則は適用順序評価、正規順序評価共に同じであると仮定していいので、述語式が評価された後に結果式と代替式の どちらか が評価されます。
  3. 述語式を評価した結果として結果式が評価されるため、代替式を評価することなく綺麗に終えることができます。

かな。