正则序和应用序

  • 最近学习SICP一书中,1.1.5节提到了应用序和正则序。对一个组合式进行求解,解释器对其进行执行求值运算的方式并不是唯一。其中分为两种两种求值模型:正则序求值,以及应用序求值。
    • 正则序:完全展开而后归约。这种求值模型是先不求出运算对象的值,直到实际需要它们的值时再去做。首先用运算对象表达式去替换形式参数,直到得到一个只包含基本运算符的表达式,然后在去执行求值。
    • 应用序:先求值参数而后应用。解释器将先对组合式的各个元素求值,即将过程体中的每一个形参用实参代替,然后在对这一过程体求值。
      同时通过练习1.5论证了这两种求值方式存在的差异性(Lisp采用应用序求值)
      这里写图片描述
  • (前提条件:无论采用正则序或者应用序,假定特殊形式的if的求值规则是一样的,其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分)
    接下来分析,当解释器使用不同的求值方式会导致不同的结果吗?答案是肯定的。
    • 我们对(define (p) (p))的定义可知,无论解释器使用的是什么求值方式,调用 (p) 总是进入一个无限循环(infinite loop),因为函数 p 会不断调用自身。
    • 解释器采用应用序求值,根据应用序的定义,我们可知在应用序中,所有被传入的实际参数都会立即被求值,因此执行 (test 0 (p)) 时,实际参数 0 和 (p) 都会被求值,而对 (p) 的求值将使解释器进入无限循环(需要明白的是当前步骤仅仅是在进行实际参数求值,而未进入if判断)。即在(define (test x y))处因无限递归(p)则导致死循环。
    • 解释器采用正则序求值,先不求出运算对象的值,直到实际需要它们的值时再去做。在使用正则序的解释器里运行 (test 0 (p)) 时, 0 和 (p) 都不会立即被求值,当解释进行到 if 语句时,形式参数 x 的实际参数(也即是 0)会被求值(求值结果也是为 0 ),然后和另一个 0 进行对比((= x 0)),因为对比的值为真(#t),所以 if 返回 0 作为值表达式的值,而这个值又作为 test 函数的值被返回。因此,在正则序求值中,调用 (p) 从始到终都没有被执行,所以也就不会产生无限循环。

实际上,该问题的关键在于if判断实现的方式,其先执行谓语部分的判断,然后才根据其结果确定随后求值的子表达式部分。这个特殊性是满足练习1.5差异性的关键。//如果先对子表达式求值?

http://sicp.readthedocs.io/en/latest/chp1/5.html
https://www.zhihu.com/question/23428122

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值