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 не будет изменяемого переменная цикла).
Другие ресурсы: