計算機プログラムの構造と解釈

最近読んでるんですが、この本解答がついてない。
ググってみても、リンク切れとかでみあたらないし、
あってるか間違ってるかわからないけど、解いた分だけ毎回かいていこうと思う。

  • 1.1
    • 10
    • 12
    • 8
    • 3
    • 6
    • なし
    • なし
    • 19
    • #F
    • 4
    • 16
    • 6
    • 16
  • 1.2
(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7)))
  • 1.3
(define (square x) (* x x))

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

#目的のもの↓
(define (sum-of-bigger-num-square x y z)
  (cond ((and (> (+ x y) (+ x z)) (> (+ x y) (+ y z))) (sum-of-square x y))
        ((and (> (+ x z) (+ x y)) (> (+ x z) (+ z y))) (sum-of-square x z))
        (else (sum-of-square y z))))

; (sum-of-bigger-num-square 1 2 3) -> 13
; (sum-of-bigger-num-square 5 4 3) -> 41
  • 1.4
(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))
; 答え:
; 引数a,bに作用させるべき演算子をif文で分けている。
; 演算子と関数(データ)の区別がない。どちらも同じように使える。
    • これには少し驚いた。
    • 同じようなことがjsでもできるか考えてみた。
function plus(a,b){return a+b}
function minus(a,b){return a-b}
function a_plus_abs_b(a,b){return ((b > 0)?plus:minus)(a,b)}

// a_plus_abs_b(1,2); -> 3
// a_plus_abs_b(1,-2); -> 3
    • 新しい関数定義はいるが、これだと同じような感じじゃないだろうか。
  • 1.5
    • ちょっと難しい。
    • とりあえず普通にやったら無限ループに入った。
    • おそらく正規順序評価だと、無限ループには入らずに終わるんだろう。
    • もしかしてコレが遅延評価というやつ?