本来以为正则序求值和应用序求值都会死循环的,而用lisp实现了一下,确实死循环了(lisp是应用序求值),这更加肯定了我的想法。但是直到看了老潘的文章我才恍然大悟,原来normal-order是先substitute的,而applicative-order是先eval的。applicative-order因为先执行eval操作,一直解释(P),因此陷入死循环。而normal-order先执行substitute,变换成了
(if (= 0 0) 0 (p));
又因为if是特殊形式,如果条件表达式为true,则(p)不会被eval。因此normal-order不会死循环,而applicative-order则会死循环。