乐正

Actions speak louder than words.

Sicp-ex4-1

问题

注意,我们没办法说循环求值器是从左到右还是从右到左求值各个运算对象,因为这一求值顺序是从作为其基础的Lisp那里继承来的:如果在list-of-values里的cons从左到右求值,那么list-of-values也将从左到右求值;如果cons参数从右到左求值,那么list-of-values也将从右到左求值。

请写出一个list-of-values版本,使它总是从左到右求值其运算对象,无论作为基础的Lisp采用什么求值顺序。另外写出一个总是从右到左求值的list-of-values版本。

解答

从左到右求值
1
2
3
4
5
(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((value (eval (first-operand exps) env)))
        (cons value (list-of-values (rest-operands exps) env)))))
从右到左求值
1
2
3
4
5
6
(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((rest-value (list-of-values (rest-operands exps) env)))
        (cons (eval (first-operand exps) env)
              rest-value))))

draft

« sicp-ex3-60 sicp-ex4-2 »

Comments