sicp-answer~> 1-5
(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) 不会被求值, 直接被忽略

这一点与普通函数/过程不同, 如果是普通过程, 则会按照应用序, 先对每个参数进行求值


上一篇: 1-4
下一篇: 1-6