, - :
(defun delete-adjacent-duplicates (list &key key (test 'eql))
(loop
for head = list then (cdr head)
until (endp head)
finally (return list)
do (setf (cdr head)
(member (if (null key) (car head)
(funcall key (car head)))
(cdr head)
:key key :test-not test))))
@wvxvw, (loop for head on list finally (return list) do ...). , 3.6 , cdr undefined, , loop for head on list . 6.1.2.1.3 for-as-on,
for-as-on for as .... var 1. , step-fun ; step-fun cdr.... for as , .
, , : loop for head on list . , , do:
(defun delete-adjacent-duplicates (list &key key (test 'eql))
(do ((head list (cdr head)))
((endp head) list)
(setf (cdr head)
(member (if (null key) (car head)
(funcall key (car head)))
(cdr head)
:key key :test-not test))))
, head, , cdr , , , . , , member . member , - , :key :test. ( , :test del-dups :test-not of member.) : , key : , , car of head.
CL-USER> (delete-adjacent-duplicates (list 1 1 1 1 2 2 3 3 3))
(1 2 3)
CL-USER> (delete-adjacent-duplicates (list 1 2 2))
(1 2)
CL-USER> (delete-adjacent-duplicates (list 1 3 5 6 4 2 3 5) :key 'evenp)
(1 6 3)
, ; , , , cdr .