Keep on moving

あんまりまとまってないことを書きますよ

第一章(1)

練習問題を中心に行った。
SCHEMEって書き方がC系と違うので、なかなかなじめないがだんだんなれることができるとよいなと思います。
plt-schemeにて実行可能を確認。

問題1.3

考えたけどあまりきれいにかけなかった。

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

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

(define (foo x y z)
  (cond ((and (>= x y) (>= z y)) (sum-of-squares x z))
        ((and (>= x z) (>= y z)) (sum-of-squares x y))
        (else (sum-of-squares y z))))

問題1.4

SCHEMEすげぇぇぇ。まさか手続きを条件によってかえられるとは。。

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

問題1.5

正直最初はよくわからなかったけど、何度も読み返してやっとわかった。

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

に対して、

(test 0 (p))

は作用的順序と正規順序でどう違うかを考えてみた。

作用的順序
(if (= x 0)
    0
    y)

とした後で仮引数を置き換え

(if (= 0 0)
    0
    (p))

となり、(p)が返る。

正規順序
(test 0 (p))

この時点で手続き(p)を評価→(p)が返るため再度手続きとして(p)が評価される→無限ループ

plt-schemeでは無限ループになった。よって正規順序となっている。