(1)でも(2)でもないもっと深遠な意味があるなら教えてくださいよ、どなたか。
と書いておいたら、お答が来ましたよ。小川さん、ありがとうございます。
左辺値と右辺値の違い、これは定義がハッキリしているし納得いきます。となると、foo(argVar)という呼び出しが参照呼び出しであるかどうかは、次のように判定できますね。
- argVar = expr という代入文がfoo内で意味を持つ。
- argVar = expr をfoo内で行った効果/影響は、呼び側で同じ代入文を実行したときと同じ。
で、ここでまた疑問が湧くのですが、
- 参照渡しされた引数ってのは、出力引数と同じ意味? それとも、出力引数にはまた違う定義があるとか。
- 左辺値とか代入文て概念がないプログラミング言語だと、参照呼び出しって概念もないってことですかね? 値呼び出しと名前呼び出しはラムダ計算でも考えられるけど。
[追記]
概念的な話じゃなくてメカニズムを問題にしましょう。手続きの引数はスタック(の活動レコード)に積まれるとします。
という発想がそもそも間違いだったのだな。スタックを眺めていても参照呼び出しを識別することはできませんね、構文とのかねあいの問題だから。構文としての foo(argVar) と実際にスタックに積まれるデータを比較してはじめて「おー、参照呼び出しだ」とわかるんですね。
“理念としての参照呼び出し”なら、どんなプログラミング言語でもできますからね。
これ(Erlangコード)だって、“理念としての参照呼び出し”と言えなくもない。
-module(test).
-compile(export_all).bar() ->
Dict = dict:new(),
Dict1 = foo(Dict, bar),
dict:fetch(bar, Dict1).foo(Dict, Key) ->
dict:store(Key, foo, Dict).
[/追記]