Изменение n-го элемента списка

Я хочу изменить n-й элемент списка и вернуть новый список.

Я подумал о трех довольно неэлегантных решениях:

(defun set-nth1 (list n value)
  (let ((list2 (copy-seq list)))
    (setf (elt list2 n) value)
    list2))

(defun set-nth2 (list n value)
  (concatenate 'list (subseq list 0 n) (list value) (subseq list (1+ n))))

(defun set-nth3 (list n value)
  (substitute value nil list 
    :test #'(lambda (a b) (declare (ignore a b)) t)
    :start n    
    :count 1))

Как лучше всего это сделать?

13
задан Rainer Joswig 22 July 2018 в 10:23
поделиться