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 ではそういう操作をあんまりしない(儂が知らないだけかも)。