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

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

练习4-8

原文

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

(let  
)

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的一些比较什么的,大家可以看这里:。

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

(let  
)

而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))))



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

你可能感兴趣的文章
odoo 权限设置
查看>>
asp操作access提示“无法从指定的数据表中删除”
查看>>
git bash 风格调整
查看>>
997D Cycles in product
查看>>
bzoj4589 Hard Nim
查看>>
java实现pdf旋转_基于Java实现PDF文本旋转倾斜
查看>>
java二维数组内存模型_C++二级指针第二种内存模型(二维数组)
查看>>
java static import 与 import_Java中的import和static import语句之间有什么区别?
查看>>
python time库3.8_python3中datetime库,time库以及pandas中的时间函数区别与详解
查看>>
java 代替Python_Java总是“沉沉浮浮”,替代者会是Python?
查看>>
贪吃蛇java程序简化版_JAVA简版贪吃蛇
查看>>
poi java web_WebPOI JavaWeb 项目 导出excel表格(.xls) Develop 238万源代码下载- www.pudn.com...
查看>>
java 顶点着色_金属顶点着色器绘制纹理点
查看>>
php扩展有哪些G11,php 几个扩展(extension)的安装笔记
查看>>
ajax长连接 php,ajax怎么实现服务器与浏览器长连接
查看>>
oracle报1405,【案例】Oracle报错ORA-15054 asm diskgroup无法mount的解决办法
查看>>
php 5.4.24 win32,PHP 5.4.14 和 PHP 5.3.24 发布
查看>>
oracle top pid,Linux Top 命令解析 比较详细
查看>>
grub如何进入linux系统,Linux操作系统启动管理器-GRUB
查看>>
linux pbs 用户时间,【Linux】单计算机安装PBS系统(Torque)与运维
查看>>