あなたが観察行動は正しいと期待されている:num
が0であるとき psetf
戻っnil
とmapcar
場所リターンリストに戻り値 は、そう、あなたがそこにnil
、 を取得し、それが1のとき、あなたが得ます元のセル。
簡単に修正:
(mapcar (lambda (x)
(when (zerop (random 2))
(psetf (cdr x) (car x) (car x) (cdr x)))
x)
'((B . 21) (O . 24) (P . 15) (R . 47) (K . 49)))
==> ((B . 21) (24 . O) (P . 15) (47 . R) (K . 49))
は実際に、CLはちょうどあなたのケースのためのマクロrotatef
があります、
(defparameter *alist-0* '((B . 21) (O . 24) (P . 15) (R . 47) (K . 49)))
(defparameter *alist-1*
(mapcar (lambda (x)
(when (zerop (random 2))
(rotatef (cdr x) (car x)))
x)
*alist-0*))
(eq *alist-0* *alist-1*)
==> nil
(equal *alist-0* *alist-1*)
==> t ; !!!
(every #'eq *alist-0* *alist-1*)
==> t
すなわち:
(mapcar (lambda (x)
(when (zerop (random 2))
(rotatef (cdr x) (car x)))
x)
'((B . 21) (O . 24) (P . 15) (R . 47) (K . 49)))
==> ((21 . B) (O . 24) (15 . P) (R . 47) (K . 49))
最後に、そのmodifying quoted data is a very bad ideaに注意してくださいセルは同じですが、リストは異なっていますnt。
おそらく一貫してすべてのセルをコピーする方が良いでしょう:
(defparameter *alist-2*
(mapcar (lambda (x)
(if (zerop (random 2))
(cons (cdr x) (car x))
(cons (car x) (cdr x))))
*alist-0*))
*alist-0*
==> ((B . 21) (O . 24) (P . 15) (R . 47) (K . 49))
*alist-2*
==> ((21 . B) (O . 24) (15 . P) (R . 47) (K . 49))
出典
2017-11-30 03:03:09
sds
結果の一部のコンスセルは、引用されたデータに由来することに注意してください。 – sds