练习4-8

原文

Exercise 4.8. “Named let” is a variant of let that has the form

(let <var> <bindings> <body>)

The and are just as in ordinary let, except that is bound within to a procedure whose body is and whose parameters are the variables in the . Thus, one can repeatedly execute the by invoking the procedure named . For example, the iterative Fibonacci procedure (section 1.2.2) can be rewritten using named let as follows:

(define (fib n)
(let fib-iter ((a 1)
(b 0)
(count n))
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1)))))

Modify let->combination of exercise 4.6 to also support named let.

分析

希望大家还是有事没事看看原文啦,我才发现见过非常多次的modify原来是改动的意思。

关于named let的一些比較什么的,大家能够看这里:【Scheme归纳】3 比較do, let, loop

从题目的代码中我们也能够看到named-let的名字能够用cadr来取出,也就是书中的fib-iter。而body部分从下面代码中也能够看出来得用3个cdr和1个car。

(let <var> <bindings> <body>)

而parameter题中已经说了是binding中变量。取出binding用caddr,而取出题目演示样例中的a、b和count等则用map和car就可以。取出题目演示样例中的1、0和n则用map和cadr。

那么接下来我们还须要将named-let转换成函数,用list来构造这些就好,首先当然是’define。然后再用cons把name和parameter构造在一起,最后就是body啦。

当然了,在let->combination中我们须要推断是不是named-let?。那么怎么推断呢。先推断是否是let?,再推断expr的名字是不是符号(symbol?)。

最后就能够写let-combination啦。首先用写好的named-let?谓词来进行推断expr,然后为真的话就调用第257页的sequence->exp函数。否则就用cons来继续构造了。

代码


(define (named-let-name expr)
(cadr expr)) (define (named-let-body expr)
(cadddr expr)) (define (named-let-parameters expr)
(map car (caddr expr))) (define (named-let-exp expr)
(map cadr (caddr expr))) (define (named-let? expr)
(and (let? expr) (symbol? (cadr expr)))) (define (named-let->func expr)
(list 'define
(cons (named-let-name epxr)
(named-let-parameters expr))
(named-let-body expr))) (define (let->combination expr)
(if (named-let? expr)
(sequence->exp
(list (named-let->func expr)
(cons (named-let-name expr)
(named-let-exp expr))))
(cons (make-lambda (let-vars expr)
(list (let-body expr)))
(let-exp expr))))


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

http://blog.csdn.net/nomasp

【SICP练习】152 练习4.8的更多相关文章

  1. Lisp和SICP

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

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

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

  3. 《SICP》读后感:关于软件本质的一点思考

    摘要:软件本身不是目的,人类的需求才是目的,而软件只是达到目的的手段. 软件的本质在于控制复杂性,这个复杂性并非来自于计算机,也并非来自于现实世界,而是来自于人类的思维和知识体系. 软件被使用的广泛性 ...

  4. SICP 习题 (1.7) 解题总结

    SICP 习题 1.7 是对正文1.1.7节中的牛顿法求平方根的改进,改进部分是good-enough?过程. 原来的good-enough?是判断x和guess平方的差值是否小于0.001,这个过程 ...

  5. SICP 习题 (1.14)解题总结

    SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...

  6. leecode 每日解题思路 152 Maximun Product Subarray

    问题描述: 问题链接:152 Maximum Product Subarray 在经典的算法解析中, 有关的分治和动态规划的,经典题型之一就是求最大子段和, 这道题就是他的变形:求最大子段积; 这个问 ...

  7. SICP 习题 (1.8) 解题总结

    SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的 ...

  8. sicp第1章

    牛顿迭代法求平方: (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) ...

  9. SICP 阅读笔记(二)

    Chapter 1: Building Abstractions with Procedures 2015-09-29 016 Preface of this chapter QUOTE: The a ...

随机推荐

  1. 移动端的vue项目,启动错误:Module build failed: Error: No PostCSS Config found in:

    新建一个postcss.config.js 写上下面代码 `module.exports = { plugins: { 'autoprefixer': {browsers: 'last 5 versi ...

  2. 操作Map

    ///操作Map Map<String,Object> userInfo = new HashMap(); userInfo.put("uid", adUserEnti ...

  3. java 模拟ajax上传图片

    1.maven 引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime --> &l ...

  4. electron 新手教程 打包 exe

    1.安装nodejs(会自动安装npm) 2.桌面新建文件夹    your-app  (下面目录结构) your-app/ ├── package.json ├── main.js └── inde ...

  5. vue非父子组件间传参问题

    最近在使用vue进行开发,遇到了组件之间传参的问题,此处主要是针对非父子组件之间的传参问题进行总结,方法如下:一.如果两个组件用友共同的父组件,即 FatherComponent.vue代码 < ...

  6. weak和alias

    一.强符号和弱符号 在C语言中,如果多个模块定义同名全局符号时,链接器认为函数和已初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 根据这个定义,Linux链接器使用下面的 ...

  7. 作为一名Android APP开发者的自我总结

    每当接近年尾,最痛苦的工作无疑是写年终总结,写总结的同时不禁感叹这一年过得不容易阿.突然想起这一年也是自己开发Android APP的第一年,于是觉得应该给自己的APP来一个年终总结. 一.开发方面严 ...

  8. 陈-朱-兴- js写法【案例】:

    ajax请求: 一.从服务器端请求数据: var url = '';url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='+ ...

  9. 图论之堆优化的Prim

    本题模板,最小生成树,洛谷P3366 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边 ...

  10. 200 from memory cache / from disk cache / 304 Not Modified 区别

    三者情况有什么区别和联系,什么情况下会发生200 from memory cache 或 200 from disk cache 或 304 Not Modified? 200 from memory ...