Решение упражнения 1.5 из SICP

14 August, 2007 (22:38) | Решения упражнений

Итак, аппликативный порядок вычислений и нормальный.

При аппликативном порядке вычислений сначала полностью вычисляются операнды, а затем происходит вычисление процедуры с вычисленными значениями операндов. То есть при вычислении

(test 0 (p))

прежде всего (до собственно выполнения операций из тела процедуры) нужно будет вычислить (p). Но по хитрому определению для вычисления значения (p) необходимо вычислить… опять же (p). Таким образом интерпретатор зацикливается.

При нормальном порядке операнды вычисляются не сразу, а лишь по мере необходимости при использовании в теле процедуры. Поэтому сначала вычисляется предикат if, он оказывается истинным и потому функция возвращает 0, так и не столкнувшись с необходимостью вычислять (p).

Это упражнение немного более тонкое, чем предыдущие. Убедитесь, что вы полностью разобрались в отличиях аппликативного и нормального порядка вычислений перед тем, как двигаться дальше по книге.

Comments

Comment from filimonix
Date: January 6, 2014, 12:21 pm

Я правильно понял, что нормальный порядок вычислений является тем, что обычно называют ленивостью? Или есть ещё какие-то нюансы?

Comment from Мария
Date: September 22, 2017, 9:17 am

Спасибо, большо! Очень понятно объяснили. Интуитивно я поняла сразу, в чём дело, но выразить словами, как Вы это сделали, не могла :)) Теперь всё разложилось по полочкам.

Write a comment