Suppose we are talking about Common Lisp.
There is a macro
(push item list) that pushes the
item value to the top of the
list . In essence, it is equivalent to
(setf list (cons item list)) .
Accordingly, in order to destructively insert an element into the list from the desired position, you need to take the list after this position, and replace it by inserting the element using
True, there is one problem - the tail is most reasonable to get using
nthcdr , and this is a function, not an accessor (like
cdr ), and
setf so easy not to give it away. Just insert after the position is written - take
nthcdr - you can feed it
setf , that's the thing with the ends:
(defun insert-after (item list index) "Destructively inserts 'item' into 'list' after 'index'." (push item (cdr (nthcdr index list))) list)
But to insert before the position will have a bit more cunning, the case with a zero
index must be specially processed. It will turn out to be a macra, and not a function (since it makes no sense to make a function
(setf list …) - the scope is different, see example 8.6.8 by reference):
(defmacro insert-at (item list index) "Destructively inserts 'item' into 'list' before 'index'." `(if (zerop ,index) (push ,item ,list) (insert-after ,item ,list (1- ,index))))
(setf test-list '(abcd)) (insert-at 'z test-list 0) => (zabcd) (insert-at 'x test-list 5) => (zabcdx)
For deletion, the easiest way is probably to use
setf - for example, to remove the first list item, you need to replace the list itself with
cdr from it. To remove the second one, replace
cddr . Etc.
If the logic of insertion is clear, then there should be no problems with the removal.