Вызов по необходимости vs вызов по имени

Я не понимал разницы между вызовом по имени и вызовом по необходимости. Как я понял, метод Call-by-need восстанавливает возвращенный ответ. Но как это нам помогает и есть ли принципиальная разница между результатами?

Например,

begin integer n;
  procedure foo(e, n);
  integer e, n;
  begin
    for n := 1 step 1 until 10 do begin
      prints(`;;; the value of e is ');
      printnln(e)
    end
  end;
  foo(2 * n, n)
end

Итак, при вызове по имени, как я понял, мы получим:

;;; the value of e is 2
;;; the value of e is 4
;;; the value of e is 8

и так далее. Это потому, что мы передаем 2 * n в e , а e вычисляется каждый раз с новым i . Что произойдет при вызове по необходимости?

17
задан Amit 11 January 2012 в 13:32
поделиться