【SICP练习】150 练习4.6

练习4-6

原文

Exercise 4.6. Let expressions are derived expressions, because

(let (( ) … ( )) )

is equivalent to

((lambda ( … ) ) )

Implement a syntactic transformation let->combination that reduces evaluating let expressions to evaluating combinations of the type shown above, and add the appropriate clause to eval to handle let expressions.

分析

这道题需要我们将let表达式转换成相应的表达式。

(let (( ) … ( )) )

从上面的示例我们可以看到在let表达中,假设其为expr,用cdr可以得到(( ) … ( )),然后再用高阶函数map搭配car来取出所有的var。

同样的,如果要取出exp部分,先用cadr,再用高阶函数map搭配cadr。

而body部分用caddr就可以直接求出了。

然后就可以开始写let->combination,其传入一个参数expr。

((lambda ( … ) ) )

根据这段示例代码呢,我们先调用书中第256页的make-lambda来构造前面的一部,这个函数有两个参数parameter和body。

这样一来就全部都完成了,当然了,还需要将let?加入到eval中,在此之前也要定义let?。同样要调用第256页的tagged-list?。那么接下来就是具体的代码咯。

代码

(define (let-vars expr) (map car (cadr expr)))

(define (let-exp expr) (map cadr (cadr expr)))

(define (let-body expr) (caddr expr))

(define (let->combination expr)
  (cons (make-lambda (let-vars expr) (let-body expr))
    (let-exp expr)))

(define (let? expr) (tagged-list? expr ‘let))

((let? expr) (eval (let->combination expr) env))
时间: 2024-11-08 14:17:28

【SICP练习】150 练习4.6的相关文章

ORA-00020:maximum number of processes (150) exceeded 错误解决方法

解决方案 1.查看进程数 SQL> show parameter proce NAME                                 TYPE        VALUE------------------------------------ ----------- --------------aq_tm_processes                      integer     1db_writer_processes                  integer

SICP 习题 (1.46)解题总结

SICP 习题 1.46 要求我们写一个过程iterative-improve,它以两个过程为参数,其中一个参数用来检测猜测是否足够好,另一个参数用来改进猜测.过程iterative-improve应该返回另一个过程,所返回的过程接收一个参数作为初始猜测,然后不断改进猜测直到结果足够好.题目还要求我们使用iterative-improve重写1.1.7的sqrt过程和1.3.3节的fixed-point过程. 因为涉及到高阶函数,所以整个题目理解起来有一点点费劲.不过这道题作为第一章的收官题确实

SICP 1.19

解:这道题很有意思,结论是斐波那契数也可以用对数时间复杂度获得. 通过Tpq(Tpq)=TPQ建立方程,解得: P=pp+qq Q=qq+2pq 程序如下: (define (fib n)   (define (even? n)     (= (remainder n 2) 0))   (define (fib-iter a b p q count)     (cond ((= count 0) b)           ((even? count) (fib-iter a           

SICP 1.12

解: (define (pascal n)   (define (get n i)     (cond ((<= i 1) 1)           ((>= i n) 1)           (else (+ (get (- n 1) (- i 1))                    (get (- n 1) i)))))   (define (iter i n)     (if (<= i n)         (and (print (get n i))          

使用windows server2012时FileZilla客户端连接时报150 Opening data channel for directory listing of &quot;/&quot; 响应:425 Can&#39;t open data connection

425 Can't open data connection 和 读取目录列表失败 问题解决 这个问题主要是由于使用Passive Mode模式造成的,解决这个问题很简单: 1.在ftp服务软件中设置指定端口地址范围,允许Passive Mode使用,比如60000-60020 2.然后在ftp服务器的系统防火墙上打开这些tcp端口,比如是60000-60020,如果使用windows自带的防火墙,就一条一条的增加,20行有点麻烦,但是可以解决. 如果ftp用户较多,可以扩大端口范围. 3.如果

150吨地磅厂家谈过磅管理方法

150吨地磅厂家-上海汉衡称重设备有限公司,专业生产地磅的厂家,主营地磅.汽车衡.叉车秤.吊秤等衡器,如有需要可以联系电话:17321412037. 150吨地磅厂家谈过磅管理的方法: 过磅管理是整个系统中最重要的功能,因为所有运量信息从此模块获得,而且此模块是将客户与业务连接的最重要环节:包括煤炭外销.外购.内购.内销.转场.零售.自用煤几大业务,下面以表格形式具体说明系统自动执行过程: 外销.内销一次称重:(1)刷IC卡获取可执行合同信息:(2)刷卡事同时获得车辆信息,卡作为串联车辆执行业务

SICP 习题 (2.26)解题总结:列表操作符append cons list

SICP  习题 2.26 也是不需要太多解释的题目, 题目的主要目的是让读者理解append cons list三个操作的差别. 直接运行下面代码中的start-test-2-26过程就可以了,需要留意一下的是append 过程, cons过程和list过程的使用. 最好翻一下mit-schme的参考手册,对了,一直没有提mit-scheme的手册,建议大家去下载一份备用,需要的时候查一查 链接如下: http://www.gnu.org/software/mit-scheme/ 有pdf版可

SICP 习题 (2.16)解题总结:避免误差的区间计算系统

SICP 习题 2.16 问我们能不能设计一个没有问题的区间计算系统,可以避免习题2.14中的问题.题目还吓我们说这可能很难. 这一下就把我吓住了,你不是说很难吗,那就很难吧,我不会.呵呵

SICP 习题 (2.15)解题总结:区间误差的深入思考

SICP 习题 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现问题,这个问题是Lem发现的.接着,一个叫Eva的人也发现了这个问题,同时她还有更深入的思考. Eva觉得,如果一个公式可以写成一种形式,其中具有非准确性的变量不重复出现,那么Alyssa的系统产生的区间的限界会更紧一些. 因此,她觉得在计算并联电阻时,公式"1/(1/R1 + 1/R2)"比公式"(R1*R2)/ (R1 + R2)"要