Osamu NAKAMURA
naka****@hasak*****
2004年 9月 17日 (金) 22:16:29 JST
中村です。 山田さん、shiro さん、コメントありがとうございます。 基本的なところで引っかかってしまっていて、恐縮です。 At Fri, 17 Sep 2004 15:44:47 +0900, yamada wrote: > 値渡しではなく、リファレンス渡しになっていると思います。 なぜ、値渡しと思い込んでいたかというと、 1.関数の引数は評価されてから渡される。 2.引数として変数を記述した場合、その変数も”評価”した結果が渡される。 3.変数を評価した結果は、その変数の値である。 4.引数として、変数を記述するとその値が渡される とイメージしているためでした。 > > (define tbl (make-hash-table)) > > make-hash-tableで作られた、無名のハッシュ「を指すポインタ」を、 > tblという名前の変数に束縛しています。 ここは、漫然と tbl という変数に hash table なるものが入っている、 としか思ってなかったのですが、 tbl という変数には、どこかに作られた hash table を指すポインタが 入っている、 ということなのですね。 一般的に、変数への値の代入とは、どこかに確保された”値”への ポインタをその変数に保持すること、と理解していいでしょうか? # ”束縛”の理解も、心許なくなってきたので、google 中。 > > ((lambda (tbl key value) > > (hash-table-push! tbl key value)) > > tbl 1 "a") > > ((lambda (key value) > > (hash-table-push! tbl key value)) > > 2 "b") > > ここでtblとして渡されるのは、上記の、無名のハッシュを指すポインタなので、 ここが少し理解できなくて、 (function var) において、var が値渡しというときは、var の値そのものを渡し、 参照渡しというときは、var という変数へのポインタを渡す、 ということですよね? 上記の > > tbl 1 "a") において、”無名のハッシュを指すポインタ”は tbl と言う変数の保持する”値” であって、参照渡しならば、tbl という変数へのポインタが渡されるのではないか、 と思えてしまいます。 At Thu, 16 Sep 2004 23:22:30 -1000 (HST), Shiro Kawai wrote: > はい。その通りです。全てリファレンス渡しと考えてもらって構いません。 > 実装上、ある種のデータ (文字や小さな整数) は値で渡されますが、 > 変更不可能なオブジェクトは値渡しでも参照渡しでも同じことになるので > 意味的には気にしないで良いでしょう。 > (なおこの理由から、副作用が一切無い処理系では意味的に値渡しと参照渡しの > 区別は不要です)。 うー、すいません。最後の (なおこの理由から、、、)の一文が理解できてません。T_T "副作用が一切無い"って、関数の実行結果は返り値としてのみ返され、 それ以外の影響はその関数外へはもたらされない、ということでしょうか? 関数内での変更が、暗黙には関数外へ影響しない以上、値渡しだろうが、参照渡し だろうが、値を使うだけだから同じこと、ということ? --