Mapcar就地:破坏性地修改列表列表

Mir*_*lov 0 lisp common-lisp in-place

我有一份清单清单:(setq xs (list (list 1 2 3) (list 4 5 6) (list 7 8 9))).我想删除每个列表中的第一个元素((2 3) (5 6) (8 9)).非破坏性的做法很容易:(mapcar 'cdr xs).但我想改变原始列表.我试过了:

(mapcar (lambda (x) (setf x (cdr x))) xs)
(mapcar (lambda (x) (pop x)) xs)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.如何xs在不创建任何临时列表的情况下尽可能有效地更改每个变量列表?

Rai*_*wig 6

用途MAP-INTO:

CL-USER 16 > (let ((s (list (list 1 2 3)
                            (list 4 5 6)
                            (list 7 8 9))))
               (map-into s #'rest s))
((2 3) (5 6) (8 9))
Run Code Online (Sandbox Code Playgroud)