(define (p) p)
(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
(当单独调用 (p)
时, 因为 p 的定义就是调用 p, 这会导致无限循环, 所以一切都停滞了)
调用test时, 假设用 应用序 与 正则序 分别看待这个调用的过程:
应用序: 先对参数进行求值, 然后再将结果传递
因为会先对参数进行求值, 当对 (p)
进行求值时, 发生无限递归调用, 造成死循环, 一切停滞, 什么也不会发生
正则序: 先展开替换为过程中的定义, 然后再进行求值
所以 test 先展开为了 if, 将 x 替换为 0, 将 y 替换为 (p):
(if (= 0 0)
0
(p)))
if 是个特殊的 惰性
的过程, 会先判断条件, 然后再对分支之一求值, 而不是先对两个分支都求值再根据条件选择
这里因为条件为真, 所以直接选择了第一分支的 0 作为整个 if 的值, 第二分支的 (p) 不会被求值, 直接被忽略
这一点与普通函数/过程不同, 如果是普通过程, 则会按照应用序, 先对每个参数进行求值