练习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))


感谢您的訪问,希望对您有所帮助。

欢迎大家关注或收藏、评论或点赞。


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

http://blog.csdn.net/nomasp


版权声明:本文 NoMasp王克在 原创文章,未经授权严禁转载!欢迎到我的博客:http://blog.csdn.net/nomasp

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

  1. 设置line-height:1.5和line-height:150%或者line-height:150px的区别

    直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...

  2. Lisp和SICP

         大概不少programmer都看过<黑客与画家>,作者用了整整一章的篇幅讨论Lisp的强大.我自然就会手痒痒.      几个月前,几天内攻城略地搞定了Python,用的方法便是 ...

  3. mysql errno 150

    mysql error Number 1005can't creat table'/test/#sql-640_1.frm'(errno:150)三种可能问题 外键和被引用外键类型不一样,比如inte ...

  4. MySQL ERROR 1005: Can't create table (errno: 150)的错误解决办法

    在mysql 中建立引用约束的时候会出现MySQL ERROR 1005: Can't create table (errno: 150)的错误信息结果是不能建立 引用约束. 出现问题的大致情况 1. ...

  5. while做法1.兔子生兔子 2.求100以内质数的和3.洗发水15元 牙膏5元 香皂2元 150元的算法

    1.兔子生兔子 2.求100以内质数的和 3.150块钱花完问题

  6. line-height1.5和line-height:150%的区别

    一.区别 区别体现在子元素继承时,如下: 父元素设置line-height:1.5会直接继承给子元素,子元素根据自己的font-size再去计算子元素自己的line-height. 父元素设置line ...

  7. 【UOJ #150】【NOIP 2015】运输计划

    http://uoj.ac/problem/150 用树链剖分求lca,二分答案树上差分判断. 时间复杂度$O(nlogn)$,n,m同阶. #include<cstdio> #inclu ...

  8. SICP— 第一章 构造过程抽象

    SICP  Structure And Interpretation Of Computer Programs 中文第2版 分两部分  S 和 I 第一章 构造过程抽象 1,程序设计的基本元素 2,过 ...

  9. line-height:150%和 line-height:1.5 的区别

    父元素line-height为150%或1.5em时,依据父元素的字体大小计算出行高值让子元素继承父元素line-height为1.5时,依据子元素字体大小计算其行高值.

随机推荐

  1. Akka FSM 源代码分析

    Akka FSM 源代码分析 萧猛 <simonxiao@qq.com> 啰嗦几句 有限状态机本身不是啥新奇东西,在GoF的设计模式一书中就有状态模式, 也给出了实现的建议.各种语言对状态 ...

  2. 程序猿学英语—In July the English learning summary

    七月的英语学习更加曲折,七月初.查看更多,周六和周日可以保证每天两小时的英语教室学习.周一到周 五一般是上完晚自习九点多来机房学习英语,学习一个小时十点多再回宿舍. 考完试,回家待了五天,不好意思的说 ...

  3. WPF技术触屏上的应用系列(六): 视觉冲击、超炫系统主界面、系统入口效果实现

    原文:WPF技术触屏上的应用系列(六): 视觉冲击.超炫系统主界面.系统入口效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体 ...

  4. paip.提高工作效率--数据绑定到table原则和过程Angular js jquery实现

    paip.提高工作效率--数据绑定到table原理和流程Angular js  jquery实现 html #--keyword 1 #---原理和流程 1 #----jq实现的代码 1 #----- ...

  5. Windows8.1和Ubuntu14.04双系统卸载Ubuntu參考教程[图]

    我之前编写并公布了<Windows8.1安装Ubuntu14.04双系统參考教程及双硬盘注意事项>这篇教程,而本文提供的卸载Ubuntu方法适用于这篇教程,其它方法安装的Ubuntu可适当 ...

  6. C++ primer札记10-继承

    包.继承,多态性C++的三个基本概念,在这里,我们重点总结继承的东西 1 类派生列表 类派生列表中指定一个派生类继承基类,来自列表与一个或多个基类如: class B : public A1,prot ...

  7. IOS开发——手动设置屏幕旋转

    在移动开发过程.您可能需要跨越看看你的手机.有可能是所有的接口必须跨越,有可能是一个交叉通过电话,当用户当,你的接口也希望他能跨越.还有可能的是,界面的一部分需要被侧向显示.视情况而定,有不同的方法来 ...

  8. 无需Visual Studio,5容易的 - 分为报告

    总报告设计,例如RDLC.水晶报表等.,需要安装Visual Studio.由VS提供报表设计界面设计报告,由VS设计报告.NET非常方便开发者,.但对于非开发,安装4G一个VS.并且需要Licens ...

  9. LeetCode——Pascal&#39;s Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...

  10. 一个demo

    package com.entity; /*2015-7-18*/ public class Rover { private CurrentPosition position; public Rove ...