lisp の変数って
値渡し?参照渡し?よくわからんのだが (setf PLACE VALUE) の VALUE が参照だと参照渡しっぽくなるのかと思ってた。
;; これは値渡しっぽい >>> (setf n1 3) 3 >>> (setf n2 n1) 3 >>> (setf n1 4) 4 >>> n2 3 ;; これも値渡しっぽい >>> (setf s1 "some string") "some string" >>> (setf s2 s1) "some string" >>> (setf s1 "another string") "another string" >>> s2 "some string" ;; これも値渡しっぽい >>> (setf l1 '("first" "second" "third")) ("first" "second" "third") >>> (setf l2 l1) ("first" "second" "third") >>> (setf l1 '("1st" "2nd" "3rd")) ("1st" "2nd" "3rd") >>> l2 ("first" "second" "third")
と思ってたんだけど全然違う。
;; 部分的に書き換えたり >>> (setf l3 '("first" "second" "third")) ("first" "second" "third") >>> (setf l4 l3) ("first" "second" "third") >>> (setf (second l3) "2nd") ;l3 の second を変更すると "2nd" >>> l3 ("first" "2nd" "third") >>> l4 ("first" "2nd" "third") ;l4 の second も変わってる ;; 破壊的なことしたり >>> (setf s3 "original string") "original string" >>> (setf s4 s3) "original string" >>> (nreverse s3) ;s3 を破壊的に変更すると "gnirts lanigiro" >>> s4 "gnirts lanigiro" ;s4 も変わってる
たぶん (setf PLACE VALUE) で PLACE は VALUE への参照になるけど、(setf PLACE OTHER-VALUE) で全く別の参照になってしまふだけ。参照先のデータそのものをいぢれば参照渡ししたときみたいに振舞うけど Lisp ではそういう操作をあんまりしない(儂が知らないだけかも)。