値渡しとか

情報ありがとうです。 to NANRI さん
http://raido.sakura.ne.jp/southly/rn/index.rb?1176330136.txt
リンク先のリンク先(Gauche の ML アーカイブ)より

正確には、Schemeでは全ての変数が実は実体へのポインタを保持していて、
「ポインタ」が値渡しされる、と考えれば良いと思います。

てことは

(setq var1 '(1 2 3)) ;*1
=>(1 2 3)
(setq var2 var1) ;*2
=>(1 2 3)

(setq var expr) とするとまず expr が評価されて値になる(*1 は新しいリスト、*2 は var1 の参照先)。んで setq は var をその値に束縛する。というのは var はその値へのポインタを保持する。setq 式に渡されるのは値(=値渡し)で、var が保持するのは参照。
だもんで

(setf (car var1) "car")
=>"car"
var1
=>("car" 2 3)
var2
("car" 2 3)

参照先を破壊的に変更すると同じ値を参照する別の変数の値も変わってる。
つーことは

(setq var3 (cons (car var1) (cdr var1))) ;*3
=>("car" 2 3)
(setf (car var1) "first") ;*4
=>"first"
var1
=>("first" 2 3)
var3
=>("car" 2 3)

*3 で var3 には新しいリストを作って束縛してるんで、*4 で var1 を破壊的に変更しても var3 は変更されない。


あーすっきりした。