SICP Exercise 4.7

SICP Exercise 4.7

a)为什么let*表达式可以重写为一些嵌套的let表达式?

因为嵌套的let表达式可以让已经做了的约束都是可见的。例如:

(let* ((x 3)
       (y (+ x 2))
       (z (+ x y 5)))
  (* x z))
可以重写为:

(let ((x 3))
  (let ((y (+ x 2)))
    (let ((z (+ x y 5)))
      (* x z))))
b)下面我们参考该例子,写出把let*表达式转化为let表达式的实现:

(define (let*->nested-lets exp)
  (define (expand-clauses bindings body)
    (if (null? bindings)
        body
        (make-let (list (car bindings))
                  (expand-clauses (cdr bindings) body))))
  (expand-clauses (cadr exp) (caddr exp)))

(define (eval-let* exp env)
  (eval (let*->nested-lets exp) env))
c)可以向eval中添加
(eval (let*->nested-lets exp) env)
但是我更喜欢以数据导向的方式,所以只需再增加一条语句:

(put 'let* eval-let*)


测试结果:

;;; M-Eval input:
(let* ((x 3)
      (y (+ x 1)))
  (+ x y))

;;; M-Eval value:
7





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值