問題1.4

  • とりあえず関数を動かしてみて、どのような振る舞いをするか確かめる
  • a-plus-abs-b は a + abs(b) のことだということは動かせば分かる。
(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))

(a-plus-abs-b 1 2)
; 3

(a-plus-abs-b 1 -2)
; 3

(a-plus-abs-b -1 2)
; 1

(a-plus-abs-b -1 -2)
; 1

1.1.3節より

ルールA

  1. 組み合わせの部分式を評価する
  2. 最左部分式の値である手続き(演算子)を、残りの部分式の値である引数(被演算子)に作用させる。

ルールB

  1. 数字列の値は、その表す数値とする
  2. 基本演算子の値は、対応する演算を実行する機会命令の列とする
  3. それ以外の名前の値は、その環境で名前と対応付けられたオブジェクトとする

上記定義に従えば、ルールA.1 → ルールA.2 → ルールB.2 により、+ or - の演算子のどちらかが選択される。

;手動トレースによる回答
(a-plus-abs-b 5 -3)
==> ((if (> -3 0) + -) 5 -3)
==> ((if #f + -) 5 -3)
==> (- 5 -3)
==> 8