【问题标题】:Difference between Call-By-Name and Call-By-ReferenceCall-By-Name 和 Call-By-Reference 之间的区别
【发布时间】:2011-05-22 13:25:12
【问题描述】:

参数传递技巧:

根据我对这两种技术的了解。

通过引用调用:

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

按姓名呼叫:

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

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

【问题讨论】:

    标签: scope parameter-passing


    【解决方案1】:

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

    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 有 thunk 的想法,但使用 call-by-need,其中 1 / x 在需要之前不会被评估,但只会被评估一次(更不用说 Haskell 没有可变循环变量)。

    其他资源:

    【讨论】:

    • 这是迄今为止我遇到的这个(类似)问题的最佳答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多