Хотя вы можете реализовать запрошенную функциональность со списками, естественным способом решения этой проблемы является использование vector
, и помните, что в Схеме индексы начинаются с 0 (поэтому второй аргумент дляvector-set!
- это 1
, а не 2
):
(define thevector (vector 0 1 0 0 7 7 7))
; thevector is #(0 1 0 0 7 7 7)
(vector-set! thevector 1 4)
; thevector is #(0 4 0 0 7 7 7)
Теперь, если вам определенно нужно использовать список, что-то вроде этого будет работать:
(define (set-cell lst idx val)
(cond ((null? lst) '())
((zero? idx) (cons val (cdr lst)))
(else (cons (car lst)
(set-cell (cdr lst) (sub1 idx) val)))))
И вы бы назвали это так:
(define thelist '(0 1 0 0 7 7 7))
(set-cell thelist 1 4)
> (0 4 0 0 7 7 7)
Опять же, я использую индексирование на основе 0, как это принято.Также обратите внимание, что thelist
был не изменен, вместо этого set-cell
возвращает новый список с модификацией.