Ben olabilir biraz geç ama farklı bir cevabım var. Fonksiyonel program paradigmasının bir kısmı, mümkün olduğunda verilerin değiştirilmesinden kaçınmaya çalışmak gibi görünmektedir. Verimlilik nedeniyle burada diğer cevaplarla gitmek isteyebilirsiniz. Ama aksi halde, bu gibi olmayan bir değişen yapısıyla işleve bakalım:
aşağıdaki testleri geçer
(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))))))
(kod Tavuk Planı yazılmış ve "missbehave" kütüphane ile testler Ancak, oldukça portatif bir şema gibi görünüyor.)
Bu, veri yapısının dışında kalmak istediğiniz işlevsellik, hücrelerin rastgele yeniden atanması gibi bir işlevse, belki de gerçekten bir liste istemediğinizi düşündünüz mü? ama bunun yerine belki bir vektör? –