История изменений
Исправление lovesan, (текущая версия) :
Во-первых, в лиспе связных списков вообще нет. Есть только cons-ячейки и символ NIL.
Во-вторых, в лиспе все принято делать в функциональном стиле.
В-третьих, касательно массивов - дело в том что существуют разные виды массивов, и для некоторых операция «вставки» не имеет смысла. Для других видов, ее смысл неоднозначен.
Самое близкое к дотнетовскому, скажем, List<>, или к питоновскому списку, это одномерные расширяемые массивы с указателем заполнения.
Для них не составляет труда написать функцию самому:
(defun vector-insert (vector index element)
(declare (type (array * (*)) vector)
(type (integer 0 #.array-total-size-limit) index))
"Inserts an ELEMENT into the VECTOR at an INDEX.
The VECTOR must be an adjustable one-dimensional array with a fill pointer."
(let ((capacity (array-total-size vector))
(fp (fill-pointer vector)))
(when (or (< index 0)
(> index fp))
(error 'type-error :datum index
:expected-type `(integer 0 ,fp)))
(when (= fp capacity)
(adjust-array vector (1+ (* capacity 2))))
(incf fp)
(setf (fill-pointer vector) fp)
(replace vector vector :start1 (1+ index) :start2 index)
(setf (aref vector index) element)
(values index vector)))
Исходная версия lovesan, :
Во-первых, в лиспе связных списков вообще нет. Есть только cons-ячейки и символ NIL.
Во-вторых, в лиспе все принято делать в функциональном стиле.
В-третьих, касательно массивов - дело в том что существуют разные виды массивов, и для некоторых операция «вставки» не имеет смысла. Для других видов, ее смысл неоднозначен.
Самое близкое к дотнетовскому, скажем, List<>, или к питоновскому списку, это одномерные расширяемые массивы с указателем заполнения.
Для них не составляет труда написать функцию самому:
(defun vector-insert (vector index element)
(declare (type (array * (*)) vector)
(type (integer 0 #.array-total-size-limit) index))
"Inserts an ELEMENT into the VECTOR at an INDEX.
The VECTOR must be an adjustable one-dimensional array with a fill pointer."
(let ((capacity (array-total-size vector))
(fp (fill-pointer vector)))
(when (or (< index 0)
(> index fp))
(error 'type-error :datum index
:expected-type `(integer 0 ,fp)))
(when (= fp capacity)
(adjust-array vector (1+ (* capacity 2))))
(incf fp)
(setf (fill-pointer vector) fp)
(when (< index fp)
(replace vector vector :start1 (1+ index) :start2 index))
(setf (aref vector index) element)
(values index vector)))