乐正

Actions speak louder than words.

Sicp-ex3-8

问题

在1.1.3节定义求值模型时我们说过,求值一个表达式的第一个步骤就是求值其中的子表达式。但那时并没有说明应该按怎样的顺序对这些子表达式求值(例如,是从左到右还是从右到左)。当我们引进了赋值之后,对一个过程的各个参数的求值顺序不同就可能导致不同的结果。请定义一个简单的过程f,使得对于(+ (f 0) (f 1))的求值在采用从左到右求值顺序时返回0,而对实际参数采用从右到左的求值顺序时返回1。

解答

1
2
3
4
5
(define (f n)
  (if (= n 0)
    n
    (begin (set! n (- n 1))
           n)))

将上述过程带入到表达式中替换有:

1
2
3
(+ (f 0) (f 1))

(+ 0 ((set! n (- n 1)) 1))

如果使用代换模型,则在set!中把n的值设置为0后又返回1,所以表达式的值是1;否则其值应该是0。

draft

« sicp-ex3-7 sicp-ex3-9 »

Comments