SICP Practice

Practice 4.25

(define (unless condition usual-value exceptional-value)
  (if condition
      exceptional-value
      usual-value))

(define (factorial n)
  (unless (= n 1)
          (* n (factorial (- n 1)))
          1))

(factorial 5)

这样的写法,在应用序的scheme里面,不会得到结果。 因为在unless调用之前,会先求出它的三个参数condition,exceptional-value,usual-value (factorial 5)调用时,condition和usual-value分别为false和1,exceptional-value求值过程中 会继续在调用unless之前求它的参数,当n等于1的时候,第二个参数会继续求值(* 1 (factorial 0)), 然后n等于0, -1, -2 …一直无限求值下去,得不到结果。 而在正则序的情况下,调用unless的时候,如果condition是true的情况,exceptional-value就没有必要 再求值了,所以(factorial 1)会直接返回1,可以得到正确的结果。