按值,名称/参考调用,需要ML

时间:2014-12-07 23:13:41

标签: parameter-passing ml pass-by-reference callbyname call-by-value

我正在学习决赛,我在这里遇到了练习题。

问题要求

的结果
val y = ref 1;
fun f x = (!y) + (x + x);
(f (y := (!y)+1; !y)) + (!y);

在以下参数传递技术下:

  1. 按值调用
  2. 按名称呼叫
  3. 按要求致电。
  4. 在我看来,按价值来看,答案是8。 但是,我相信按姓名打电话的答案也是8,但我希望它会有所不同。我认为它是8的原因:

    • y:=(!y)+1 derefs y为1,加1,然后将y设为2
    • 第3行中的
    • !y作为f的参数,因为它被解除引用它是 作为一个值而不是作为参考传递(这可能是我所在的地方) 出错?)
    • 函数调用返回6,但是没有设置y,因为y作为上一步的值传入
    • 6被添加到y的解除引用值,即2。
    • 返回8

    这是正确的答案,如果没有,有人可以指出我哪里出错了吗?此外,有人可以向我解释在这种情况下,需求呼叫是如何工作的吗?

    非常感谢。

1 个答案:

答案 0 :(得分:1)

我发现它是如何运作的:

(y := (!y)+1; !y)是传递给f的参数。 f然后看起来像:

fun f x = (!y) + ((y:= (!y)+1; !y) + (y:= (!y)+1; !y));

所以这最终为1 + 2 + 3,最后一步+ (!y)增加3,因为这是y的当前值,给出了9。

感谢您指出我仍在按价值调用。