猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

問題1.1〜問題1.5

問題1.1 略

問題1.2 略

問題1.3

> (define (problem1-3 a b c)
    (cond 
          ((and (>= b a) (>= c a)) (+ (* b b) (* c c)))
          ((and (>= a b) (>= c b)) (+ (* a a) (* c c)))
          ((and (>= a c) (>= b c)) (+ (* a a) (* b b)))))
> (problem1-3 1 3 5)
34
> (problem1-3 5 4 3)
41

プログラムの再利用性という観点からは、やはり補助関数を使うべき。

> (define (problem1-3 a b c)
    (-
     (+
      (square a)
      (square b)
      (square c))
     (square (min a b c))))

minやmaxが使えるようなので、全部足してから一番小さいものを引くことにした。

問題1.4

演算子としてsquareのようにユーザがdefineで定義した合成手続きを使っているのではなく、式を用いていることに注意。
下のように確かに正しく動作している。

> (a-plus-abs-b 2 3)
5
> (a-plus-abs-b 2 -3)
5

問題1.5

作用的順序の評価:
手続きpの評価が無限ループとなるため終了しない。

正規順序の評価:
手続きpの代わりに0 を評価するため式の評価として0を返す。

注意。下の両者の差分を意識すること。
前者はオブジェクト1を指す名前としてpを定義しており、後者はオブジェクト1を指す名前として手続きpを定義している。そのためpの評価結果はprocedureとなる。

> (define p 1)
> p
1
> (define (p) 1)
> p
#<procedure:p>
> (p)
1