scheme的应用序
2015-09-29 20:39
120 查看
从练习1.5说起:
而后求值 (test 0 (p))
由于scheme程序是应用序解释的,所以当(p)作为实参传入时,会先解析出来(p)到底是什么,再带入到test函数中去,那么(p)就会不断被(p)解释出来,导致死循环;
用个更显然的例子看:
调用(test 0 (p)) 会输出“11111111...”无数个“1”,而不会输出“2”,也就是说,优先解释(p),再进入test;
练习1.6是这个的拓展:
如果把if定义为一个常规过程,如下所示:
那么调用sqrt-iter时, 由于里面有(new-if (good-enough?) guess (sqrt-iter)),就会先把所有的参数先计算出来,也就是good-enough?会计算一遍,guess计算一遍,(sqrt-iter)也要计算一遍;问题在(sqrt-iter)这个自我调用是致命的,自我调用后又会去解释一遍被调用的sqrt-iter中的(new-if (good-enough?) guess (sqrt-iter)),所以就无限循环了。
(define (p) (p)) (define (test x y) (if (= x 0) 0 y))
而后求值 (test 0 (p))
由于scheme程序是应用序解释的,所以当(p)作为实参传入时,会先解析出来(p)到底是什么,再带入到test函数中去,那么(p)就会不断被(p)解释出来,导致死循环;
用个更显然的例子看:
(define (p) (display "1") (p)) (define (test x y) (if (= x 0) (display "2") y))
调用(test 0 (p)) 会输出“11111111...”无数个“1”,而不会输出“2”,也就是说,优先解释(p),再进入test;
练习1.6是这个的拓展:
如果把if定义为一个常规过程,如下所示:
(define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause)))
那么调用sqrt-iter时, 由于里面有(new-if (good-enough?) guess (sqrt-iter)),就会先把所有的参数先计算出来,也就是good-enough?会计算一遍,guess计算一遍,(sqrt-iter)也要计算一遍;问题在(sqrt-iter)这个自我调用是致命的,自我调用后又会去解释一遍被调用的sqrt-iter中的(new-if (good-enough?) guess (sqrt-iter)),所以就无限循环了。
相关文章推荐
- c++中静态成员变量不能够用输入流输入问题
- 802.11 管理机制
- Java学习日记-4 StringBuffer类和数组
- Java应用服务器WildFly 推荐
- DUMP文件定位问题
- Nginx与PHP(FastCGI)的安装、配置与优化
- launch4j使用
- java文件处理相关技术
- 红黑树
- 【js】day01_JS概述_Js特点_使用JS_调试
- PDO异常处理
- mysql 主从复制+双主复制
- Ubuntu14.04/win7 双系统,Ubuntu不能连网
- URAL 1099 Work Scheduling
- 汇编语言编写的Hello World
- bash background tasks
- ios 内存小结
- ERROR ITMS-90086 有效处理方式
- linux动态链接
- Python面向对象(二)