为何正则序与应用序求值结果不同?结合SICP习题1.5分析
应用序与正则序在SICP习题1.5中的差异原因
核心前提明确:SICP书中提到的「对于可通过替换模型建模且能产生合法值的过程应用,正则序与应用序求值结果一致」,这里的**「能产生合法值」要求所有参与求值的表达式都能终止并返回有效结果**,而习题1.5中的(p)恰好是一个无法终止的表达式,这就是两种求值方式结果不同的根源。
先回顾习题代码:
(define (p) (p)) (define (test x y) (if (= x 0) 0 y)) (test 0 (p))
正则序求值的行为
正则序遵循「先替换参数,仅在必要时求值表达式」的规则:
- 调用
(test 0 (p))时,先将参数替换进test的定义,得到(if (= 0 0) 0 (p)) if是Scheme的特殊形式,它只会先求值条件部分(= 0 0),结果为真,因此直接返回0,完全不会去求值(p),最终得到有效结果。
应用序求值的行为
应用序遵循「先求值所有参数,再代入过程调用」的规则:
- 调用
(test 0 (p))时,必须先求值两个参数:0是直接量,能立即得到值;但(p)是一个递归调用自身的过程,没有终止条件,会无限递归下去,永远无法完成参数求值,因此整个调用无法得到任何结果。
回到书中结论的边界
书中的结论有明确的适用边界:只有当过程应用的**所有参数都能被合法求值(即终止并返回值)**时,两种求值方式才会得到相同结果。习题1.5正是刻意构造了一个包含「无法终止的参数表达式」的场景,打破了这个前提,因此出现了正则序能得到结果、应用序不能的差异——这也正是题目作为「非法值实例」的意义。
内容的提问来源于stack exchange,提问作者Charlie_23
相关产品推荐
相关产品推荐

