Shiro Kawai
shiro****@lava*****
2004年 9月 18日 (土) 05:19:54 JST
From: Osamu NAKAMURA <naka****@hasak*****> Subject: [Gauche-devel-jp] Re: hash table and scope Date: Fri, 17 Sep 2004 22:16:29 +0900 > ここは、漫然と > tbl という変数に hash table なるものが入っている、 > としか思ってなかったのですが、 > tbl という変数には、どこかに作られた hash table を指すポインタが > 入っている、 > ということなのですね。 > > 一般的に、変数への値の代入とは、どこかに確保された”値”への > ポインタをその変数に保持すること、と理解していいでしょうか? それで良いと思います。 > ここが少し理解できなくて、 > (function var) > において、var が値渡しというときは、var の値そのものを渡し、 > 参照渡しというときは、var という変数へのポインタを渡す、 > ということですよね? ふむ。ちょっとこちらも、参照渡しという言葉を不正確に使っていたようです。 正確には、Schemeでは全ての変数が実は実体へのポインタを保持していて、 「ポインタ」が値渡しされる、と考えれば良いと思います。 > At Thu, 16 Sep 2004 23:22:30 -1000 (HST), > Shiro Kawai wrote: > > はい。その通りです。全てリファレンス渡しと考えてもらって構いません。 > > 実装上、ある種のデータ (文字や小さな整数) は値で渡されますが、 > > 変更不可能なオブジェクトは値渡しでも参照渡しでも同じことになるので > > 意味的には気にしないで良いでしょう。 > > (なおこの理由から、副作用が一切無い処理系では意味的に値渡しと参照渡しの > > 区別は不要です)。 > うー、すいません。最後の (なおこの理由から、、、)の一文が理解できてません。T_T > "副作用が一切無い"って、関数の実行結果は返り値としてのみ返され、 > それ以外の影響はその関数外へはもたらされない、ということでしょうか? > 関数内での変更が、暗黙には関数外へ影響しない以上、値渡しだろうが、参照渡し > だろうが、値を使うだけだから同じこと、ということ? ここでも「参照渡し」の意味をちょっと不正確に使っていました。 言いたかったのは、副作用が無いなら、オブジェクトそのものへのポインタを 渡しても、オブジェクトそのものをコピーして渡しても、表面的には 区別が付かないということです。オブジェクトに変更を加えることが できないわけですから。 --shiro