que puede ser un un poco tarde, pero tengo una respuesta diferente.
Parte del paradigma del programa funcional parece tratar de evitar la modificación de datos cuando sea posible. Por razones de eficiencia, es posible que desee ir con las otras respuestas aquí. Pero por lo demás, considere una función no mutante como este:
(define (list-with lst idx val)
(if (null? lst)
lst
(cons
(if (zero? idx)
val
(car lst))
(list-with (cdr lst) (- idx 1) val))))
Qué pasa las siguientes pruebas:
(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))))))
(El código está escrito en Chicken Esquema y las pruebas con la biblioteca "missbehave" .Pero parece que es un esquema bastante portátil.)
¿Ha considerado que si este es el tipo de funcionalidad que desea eliminar de la estructura de datos, la reasignación aleatoria de celdas, entonces tal vez no desee realmente una lista, pero, en cambio, ¿tal vez un vector? –