0

私は最終試験に向けて勉強していて、ここに練習問題があります。

質問は次の結果を求めます

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 を設定しません。
  • 参照解除された y の値 2 に 6 が加算されます。
  • これは8を返します

これは正しい答えですか? そうでない場合は、誰かが私が間違っている場所を指摘してもらえますか? また、誰かがこの状況でも必要に応じて電話をかける方法を説明できますか?

どうもありがとう。

4

1 に答える 1