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

Bob*_*y S 13 scope parameter-passing

参数传递技术:

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

按参考呼叫:

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

按名称呼叫:

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

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

Cor*_*rch 17

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

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

x = 3
foo(x, 1 / x)
Run Code Online (Sandbox Code Playgroud)

如果我们的foo调用是通过引用,则第二个参数1 / x仅在有效地给出我们时进行评估:1/3 + 1/3 + 1/3.这是一个严格的评估 - 在应用函数之前完全评估每个参数.

如果我们按名称打电话,1 / x则不会严格评估.相反,它在循环中根据需要进行评估.实际上,循环变为:

loop x = 1 to 3
    sum = sum + 1 / x
Run Code Online (Sandbox Code Playgroud)

或1/1 + 1/2 + 1/3.

看一下thunk,虽然thunk并不总是意味着呼叫.Haskell有thunks的想法,但是使用call-by-need,1 / x直到需要它才会被评估,但之后只会被评估一次(更不用说Haskell没有可变的循环变量).

其他资源: