If the interpreter uses normal-order evaluation, it will expand test into an "if", which will then evaluate to 0, if it uses applicative-order evaluation, it will first evaluate 0 and (p), while trying to evaluate (p), it will enter an infinite loop.