【SICP练习】150 练习4.6
2015-09-08 00:00
281 查看
练习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
相关文章推荐
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- C++实现的一个可以写递归lambda的Y函数
- C#特性之匿名方法和Lambda表达式
- 理解C#中的Lambda表达式
- ASP.NET Eval 求值运算的一些用法
- 初步认识C#中的Lambda表达式和匿名方法
- C#3.0中Lambda表达式详解
- C#基础之Lambda表达式用法实例教程
- asp.net中eval不能定义变量的问题的解决方法
- 浅析DataBinder.Eval和Eval的区别
- Eval 函数 | Execute 语句 | ExecuteGlobal 语句使用说明
- Javascript中eval函数的使用方法与示例
- ASP Eval、Execute、ExecuteGlobal区别分析
- Asp.net中的数据绑定Eval和Bind应用示例
- IE 当eval遇上function的处理
- 为什么JS中eval处理JSON数据要加括号
- Javascript中Eval函数的使用
- Javascript中Eval函数的使用说明
- javascript eval函数深入认识