LINUX.ORG.RU

История изменений

Исправление 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)))