Вот недавно была тема про if в упражнении с тестом порядка вычисления интерпретатора. На этот вопрос я бы ответил, мол, if - особая форма, если из предиката следует одна из «логических ветвей» (пардон за мой французский), то будет вычисляться именно она, другие «ветви» вычисляться не будут. Я пришёл к такому выводу после упражнения 1.6, про то, что если мы определим свой собственный new-if как простую комбинацию, то у нас может получиться, что программа циклится из-за того, что наш new-if пытается вычислить все «ветви».
ОК, пускай.
Вот например у меня DrRacket. Пишу в нём код упражнения 1.5
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
Программа зациклится из-за того, что интерпретатор использует аппликативный порядок вычисления, то есть делает все вычисления при подстановке сразу, натыкается на (p) и циклится... Но стоп! Это ведь противоречит тому, что if - особая форма, если попали в одну «ветвь», то другую вычислять не нужно.
Можете объяснить?