我正在为期末考试而学习,我这里有一个练习题。
问题要求结果
val y = ref 1;
fun f x = (!y) + (x + x);
(f (y := (!y)+1; !y)) + (!y);
在以下参数传递技术下:
- 按值调用
- 按姓名呼叫
- 按需要打电话。
在我看来,对于按值调用,答案是 8。但是,我相信按名称呼叫的答案也是 8,但我希望它会有所不同。我认为是8的原因是:
- y
- := (!y(+1 将 y 定义为 1,将 1 相加,然后将 y 设置为 2
- 第 3 行中的 !y 用作 f 的参数,由于它被取消引用,因此它是作为值而不是作为引用传递(这可能是我所在的地方出错了?
- 函数调用返回 6,但不设置 y,因为 y 作为上一步中的值传入
- 6 被添加到 y 的取消引用值中,即 2。
- 这将返回 8
这是正确的答案吗,如果不是,有人可以指出我哪里出错了吗?另外,有人可以向我解释在这种情况下按需呼叫如何工作吗?
非常感谢。
我发现了它是如何工作的:
(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。
感谢您指出我仍在按值调用。