hazzen совет хорош (используйте массивы), так как вы, вероятно, захотите сделать много таких разрушительных обновлений, а списки очень неэффективны при произвольном доступе. Самый простой способ сделать это
(setq A (make-array 5) :initial-contents '(4 3 0 2 1))
(setf (elt 2 A) 'not-a-number)
где A - массив (хотя elt
работает для любой последовательности).
Однако, если вы должны быть работоспособным, то есть
- Вы хотите сохранить старый и новый списки
- Вы хотите, чтобы старое и новое разделяли как можно больше памяти.
Тогда вам следует использовать Common Lisp-эквивалент кода Хаззена:
(defun replace1 (list n elem)
(cond
((null list) ())
((= n 0) (cons elem list))
(t (cons (car list) (replace1 (cdr list) (1- n) elem)))))
Это выглядит медленно, потому что это так, и, вероятно, поэтому оно не включено в стандарт.
код Хаззена - это версия Scheme, которая полезна, вот что вы используете.