乐正

Actions speak louder than words.

Sicp-ex4-7

问题

let*let类似,但其中对let变量的约束是从左到右顺序进行的,每个约束都在同一个环境中完成,已经做了的约束都是可见的。例如:

1
2
3
4
(let* ((x 3)
       (y (+ x 2))
       (z (+ x y 5)))
  (* x z))

返回39.请说明,为什么一个let*表达式可以重写为一些嵌套的let表达式,并请写出一个过程let*->nested-lets完成响应的变换。如果我们已经有了let的实现(练习4.6),并希望扩充求值器去处理let*,请给eval加入一个其中的动作如下的子句

1
(eval (let*->nested-lets exp) env)

就够了吗?或者说我们必须显示地以非派生方式来扩充对let*的处理?

解答

在一组嵌套的let表达式中,上级let声明的变量对于子级let表达式是可见的。所以可以将let*表达式重写为一些嵌套的let表达式。

实现的let*->nested-lets如下:

练习4.7 (ex4-7.scm) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(define (let*->nested-lets exp env)
  (define (inner let*-exps)
    (if (null? (cdr let*-exps))
        (make-let (car let*-exps)
                  (let*-body exp))
        (make-let (car let*-exps)
                  (inner (cdr let*-exps)))))
  (inner (let*-exps exp)))

(define (let*-exps exp) (cadr exp))

(define (let*-body exp) (caddr exp))

(define (make-let let-params let-body)
  ('let let-params let-body))

draft

« Python 中的关键字with详解 sicp-ex4-8 »

Comments