Основная проблема с вашей функцией insertIndex
заключается в том, что предложение do
в loop
предназначено только для побочных эффектов, оно не меняет возвращаемого значения loop
.(И ваш insert
не имеет побочных эффектов.) Правильное предложение loop
для добавления элементов в возвращаемое значение списка - collect
.(Есть также append
и nconc
для объединения в несколько списков.)
Это рабочая функция:
(defun insert-index (list)
(loop for elt in list and i from 1
collect elt
collect i))
Ваши ожидания относительно поведения insert
иinsertIndex
функции кажутся некорректными.Вам нужно получить более ясную мысленную модель о том, какие функции являются побочными, а какие нет, и нужны ли вам побочные эффекты или нет для решения какой-то конкретной проблемы.
Кроме того, вам не следует звонить setq
для неопределенной переменной в Common Lisp.Сначала вам нужно использовать let
, чтобы ввести новую локальную переменную.
Незначительные точки: CamelCase очень недиоматичен в Лиспе.Идиоматический способ разделения слов в идентификаторах - использовать тире, как я делал в своем примере кода.И вам не нужно делать (eql something nil)
, есть специальная функция null
, чтобы проверить, является ли что-то nil
, например, (null something)
.