Пример звонка по имени - PullRequest
9 голосов
/ 26 июля 2010

В моих принципах программирования на уроке речь идет о разных вызывающих методах. Некоторые из них мы обсуждали:

  • вызов по значению
  • звонок по ссылке
  • вызов по значению / результату
  • и звонок по имени

Я не могу найти пример того, как работает вызов по имени. Кто-нибудь хочет дать мне пример? Я думаю, что когда вы берете XML-файл в качестве входных данных, это аналогично для вызова по имени. Может ли кто-нибудь привести мне более традиционный пример?

Ответы [ 3 ]

9 голосов
/ 26 июля 2010

Я буду работать на гипотетическом языке программирования.Давайте предположим, что у нас есть функция p(x), которая печатает x, а затем возвращает его.Теперь давайте определим функцию:

function foo(x, y) { return y+1; }

Теперь давайте вызовем ее с некоторыми аргументами:

foo(p(123),p(456))

x и y будут заменены параметрами, поэтомувызов foo выше приведет к:

return p(456)+1;

Таким образом, мы собираемся вывести 456 на экран и вернуть 457. В другой стратегии оценки мы сначала оценим параметры функции (печать123 и 456 на экран в процессе), а затем замените 456 на y в теле функции, в конечном итоге вернув 457.

Это придумано, но я надеюсь, что вы поняли идею.Это все о замене.

3 голосов
/ 26 июля 2010

http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name

При вызове по значению вы оцениваете аргументы, извлекая значения, которые затем передаются в функцию. foo(bar()) оценивается как arg = bar();, затем вызывается foo (arg), и в теле функции эта вновь выделенная переменная arg доступна, модифицируется, ...

При вызове по имени вы заменяете в теле функции любые ссылки на аргументы их кодом , используемым во время вызова. Затем, оценив тело, вы оцените аргументы. foo(bar()) с foo(arg) { return arg; } будет оцениваться как foo(arg) { return bar(); }

1 голос
/ 15 мая 2013

Вызов по имени работает как Вызов по ссылке , если фактический параметр равен Scaler , но может отличаться, когда фактический параметр выражение или массив тогда фактический параметр переоценивается при каждом доступе.

вот простой пример

begin
    integer n;
    procedure p(k: integer);
        begin
        print(k);
        n := n+1;
        print(k);
        end;
    n := 0;
    p(n+10);
    end;
  • вызов по выходному значению => 10 10
  • вызов повывод имени => 10 11
...