2010-12-08 43 views
11

参数传递技巧:Call-By-Name和Call-By-Reference之间的区别

从我可以在这两种技术中收集的内容。

调用由参考:

的变量的地址位置被传递到该函数,从而该函数的局部范围内,局部变量的值的任何变化将改变原始的值变量,因为它们指向相同的地方。

以名称呼叫:

实际变量正在传递到函数中。函数的局部范围内的变量值的任何更改也将反映在该函数的外部。

在我看来,这两个参数传递技术完成同样的事情?它们都对原始变量内容起作用。我有我的定义错误吗?我是否以错误的方式思考这个问题?

回答

14

调用名称与您所描述的略有不同。在伪代码,试想:

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,虽然thunk并不总是意味着按名称。 Haskell有thunks的想法,但使用call-by-need其中1/x将不会被评估,直到它需要,但然后将被评估一次(更不用说Haskell不会有一个可变的循环变量)。

其他资源:

+0

这是迄今为止最好的回答这个(类似)的问题,我已经遇到。 – 2017-11-17 20:34:27