博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【SICP练习】151 练习4.7
阅读量:6607 次
发布时间:2019-06-24

本文共 1353 字,大约阅读时间需要 4 分钟。

练习4-7

原文

Exercise 4.7. Let* is similar to let, except that the bindings of the let variables are performed sequentially from left to right, and each binding is made in an environment in which all of the preceding bindings are visible. For example

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

returns 39. Explain how a let* expression can be rewritten as a set of nested let expressions, and write a procedure let*->nested-lets that performs this transformation. If we have already implemented let (exercise 4.6) and we want to extend the evaluator to handle let*, is it sufficient to add a clause to eval whose action is

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

or must we explicitly expand let* in terms of non-derived expressions?

分析

这道题和上一道很类似,抓住题中的要点就会迎刃而解啦。那就是说从左至右求值,那么我们可以用list和car以及cdr来完成,核心思想是用递归,不断的向右边推进,直到exp为空,此时就返回body,然后结束构造。至于tagged-list?这些和上一题都是一样的。

代码

(define (let*? expr) (tagged-list? expr 'let*))(define (let*-body expr) (caddr expr))(define (let*-exp expr) (cadr expr))(define (let*->nested-lets expr)  (let ((exp (let*-exp expr))    (body (let*-body expr)))    (defien (make-lets exprs)      (if (null? exprs)      body      (list 'let (list (car exprs)) (make-lets (cdr exprs)))))    (make-lets exp)))



为使本文得到斧正和提问,转载请注明出处:

版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

转载于:https://www.cnblogs.com/NoMasp/p/4786043.html

你可能感兴趣的文章
Redis快速入门
查看>>
nodejs 相关
查看>>
Diffie-Hellman密钥交换算法
查看>>
复制表结构和数据SQL语句
查看>>
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
查看>>
免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
查看>>
Unity进阶技巧 - 动态创建UGUI
查看>>
【简单易懂的AMV图文教程-2】VEGAS基础进阶——认识关键帧
查看>>
使用css打造形形色色的形状!
查看>>
Spring切面处理
查看>>
浅谈CPU和GPU的区别
查看>>
开源大数据利器汇总
查看>>
从知名外企到创业公司做CTO是一种怎样的体验?
查看>>
Oracle 表空间和用户权限管理【转】
查看>>
如何安装nginx第三方模块
查看>>
LXC学习实践(3)快速体验第一个容器
查看>>
转:winform_webApiSelfHost及 OWIN WebAPI Service
查看>>
分库分表的理想方案
查看>>
sumatrapdf 软件介绍
查看>>
CentOS开启和关闭防火墙
查看>>