scheme的应用序

从练习1.5说起:

(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)),所以就无限循环了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值