如果你能做到這一點破壞性,那麼你可以使用incf
和last
:
(defun increment-last (list x)
(prog1 list ; return the list
(incf (first (last list)) x)))
如果您確實需要創建一個新列表,您必須走到列表的最後才能看到最後一個元素。當你這樣做,你可以跟蹤你已經看到的元素(以相反的順序),有效地使用相反的順序列表,以構建新的列表中,您使用nreconc
爲:
(defun plus-last (list x)
(do ((list list (rest list))
(rhead '() (list* (first list) rhead)))
((endp (rest list))
(nreconc rhead (list (+ x (first list)))))))
CL-USER> (plus-last '(1 2 3 4) 2)
(1 2 3 6)
如果你不與do
語法很舒服,你可以使用一個尾遞歸函數,太(其中一些Common Lisp的實現可以優化成一個圈):
(defun plus-last (list x)
(labels ((pl (list rhead)
(if (endp (rest list))
(nreconc rhead (list (+ x (first list))))
(pl (rest list)
(list* (first list) rhead)))))
(pl list '())))
你ç也烏爾德使用loop
,並表達邏輯非常清楚:
(defun plus-last (list x)
(loop for (a . b) on list
if (null b) collect (+ a x)
else collect a))
這也與maplist
來完成:
(defun plus-last (list x)
(maplist (lambda (list)
(if (endp (rest list))
(+ x (first list))
(first list)))
list))
如果從(1 2 3 4)得到(1 2 3 6),它似乎並不像_replace_那麼多。 –
啊,我誤讀了,你想給最後一個元素添加一個值,並替換。 –