Разница между Call-By-Name и Call-By-Reference - PullRequest
13 голосов
/ 09 декабря 2010

Методы передачи параметров:

Из того, что я могу собрать по этим двум методикам.

Позвоните по ссылке:

Адресное местоположение переменной передается в функцию, поэтому в пределах локальной области действия функции любые изменения значения локальной переменной изменят значение исходной переменной, поскольку они указывают на одно и то же. место.

Позвонить по имени:

Фактическая переменная передается в функцию. Любые изменения значения переменной внутри локальной области видимости функции также будут отражены за пределами функции.

Мне кажется, эти два метода передачи параметров выполняют одно и то же? Оба они действуют на исходное содержимое переменных. У меня неправильные определения? Думаю ли я об этом неправильно?

1 Ответ

17 голосов
/ 11 декабря 2010

Call-по-имени немного отличается от того, что вы описали. В псевдокоде представьте:

function foo(index, value-increment)
    sum = 0
    loop index = 1 to 3
        sum = sum + value-increment
    return sum

x = 3
foo(x, 1 / x)

Если наш вызов foo осуществляется по ссылке, второй аргумент, 1 / x, оценивается только один раз, что дает нам эффективное значение: 1/3 + 1/3 + 1/3. Это строгая оценка - каждый аргумент полностью оценивается перед применением функции.

Если мы называем по имени, 1 / x строго не оценивается. Вместо этого он оценивается в цикле по мере необходимости. По сути, цикл становится:

loop x = 1 to 3
    sum = sum + 1 / x

или 1/1 + 1/2 + 1 / 3.

Взгляните на thunks , хотя thunks не всегда означают вызов по имени. Haskell имеет идею thunks, но использует call-by-need , где 1 / x не будет оцениваться до тех пор, пока это не потребуется, но будет оцениваться только один раз (не говоря уже о том, что у Haskell не будет изменяемого переменная цикла).

Другие ресурсы:

...