Call-By-Name和Call-By-Reference之间的区别

时间:2010-12-08 23:28:46

标签: scope parameter-passing

参数传递技术:

从我可以收集到的这两种技术。

按参考呼叫:

变量的地址位置正在传递给函数,因此在函数的局部范围内,对局部变量值的任何更改都将改变原始变量的值,因为它们指向同一个变量的值。的地方。

按姓名呼叫:

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

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

1 个答案:

答案 0 :(得分:16)

按名称呼叫与您描述的略有不同。在伪代码中,想象一下:

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没有可变的循环变量)。

其他资源: