【问题标题】:Call by value, name/reference, need in ML按值调用、名称/引用、ML 中的需要
【发布时间】:2014-12-07 23:13:40
【问题描述】:

我正在准备期末考试,这里有一个练习题。

问题询问结果

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

在以下参数传递技术下:

  1. 按值调用
  2. 叫名字
  3. 按需致电。

在我看来,对于按值调用,答案是 8。 但是,我相信点名呼唤的答案也是 8,但我希望它会有所不同。我认为是8的原因:

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

这是正确的答案,如果不是,有人可以指出我哪里出错了吗?另外,有人可以向我解释一下在这种情况下需要调用如何工作吗?

非常感谢。

【问题讨论】:

  • 您似乎在解释如何处理按值调用。您是如何得出点名的答案的?
  • 我解释的过程是我对它应该如何使用按名称调用的理解。我认为这是错误的,因为正如您所说,它似乎与按值调用完全一样,但我不知道它是怎么错的。

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


【解决方案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。

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

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2013-12-15
    • 1970-01-01
    • 2012-09-28
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多