SICP Exercise 4.1
1,用let表達式去控制求值的順序:
(define (list-of-values-left-to-right exps env)
(if (no-operands? exps)
'()
(let ((first (eval (first-operand exps) env)))
(cons first (list-of-values (rest-operands exps) env)))))
(define (list-of-values-right-to-left exps env)
(if (no-operands? exps)
'()
(let ((rest (list-of-values (rest-operands exps) env)))
(cons (eval (first-operand exps) env)
rest))))
下面是對這種方法的測試:
(define (foo)
(cons (begin (display 'left)
'l)
(begin (display 'right)
'r)))
(define (foo-left)
(let ((a (begin (display 'left)
'l)))
(cons a (begin (display 'right)
'r))))
(define (foo-right)
(let ((b (begin (display 'right)
'r)))
(cons (begin (display 'left)
'l)
b)))
2,另外也可以用順序求值來控制執行順序:
(define (foo-right)
(define a (begin (display 'right)
'r))
(cons (begin (display 'left)
'l)
a))