Возможно, я немного опоздал, но у меня другой ответ.
Часть парадигмы функциональной программы, кажется, пытается избежать изменения данных, когда это возможно.По соображениям эффективности вы можете пойти с другими ответами здесь.Но в противном случае рассмотрим функцию без мутаций, такую как эта:
(define (list-with lst idx val)
(if (null? lst)
lst
(cons
(if (zero? idx)
val
(car lst))
(list-with (cdr lst) (- idx 1) val))))
, которая проходит следующие тесты:
(describe "a function that returns a list with a 'changed' value"
(it "can modify the edges of lists without having 1-off errors"
(expect (list-with '(1 2 3 4 5) 0 99) (be equal? '(99 2 3 4 5)))
(expect (list-with '(1 2 3 4 5) 4 99) (be equal? '(1 2 3 4 99))))
(it "has something to do with creating new lists"
(expect (list-with '(1 2 3 4 5) 2 99) (be equal? '(1 2 99 4 5))))
(it "doesnt just modify the contents of the original list"
(let ((a '(1 2 3 4 5)))
(list-with a 2 99)
(expect a (be equal? '(1 2 3 4 5))))))
(код написан на схеме Chicken и тестах сбиблиотека "missbehave". Но это похоже на довольно переносимую схему.)