我正在尝试使用可变对象对一个列表进行求和。这里使用let
允许我对总数和x
进行变异。我不太熟悉scheme,因此列表中的每个数字都有usecounter
语句:
(define lst (list 1 2 3 4 5))
(let mut ((counter 0))
(let ((x (car lst)))
(if (= counter 4)
x)
(if (= 0 counter)
(+ x (cadr lst)))
(if (= 1 counter)
(display (caddr lst)) ;test
(+ x (caddr lst)))
(if (= 2 counter)
(+ x (caddr lst)))
(set-car! lst (cdr lst))
(mut (+ counter 1))
)
)
但是当我运行代码时,我得到一个错误
+: contract violation
expected: number?
given: (mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))
argument position: 1st
other arguments...:
但是,当我检查
if
时,它会按预期返回lst
。我的问题是,当运行时,当应用到(caddr lst)
时,为什么3
会产生caddr
而当不应用时,它会返回(mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))
我在用R5R
编辑:为了简洁起见,我省略了一些if语句
最佳答案
好吧,所以我发现使用完全不同的实现@molbdnilo是正确的,我的理解是有缺陷的。
这是我的实现,如果其他人正在努力解决这个问题
(define (goMut)
(define mVar 0)
(define acc 0)
(define (accDo num)
(set! acc (+ num acc)))
(for-each (lambda (x) (set! mVar x) (accDo x))
(list 1 2 3 4 5))
acc
)
使用集合我们可以将列表中的值应用于外部变量,并在使用函数
accDo
在整个循环中迭代时对其进行变异功能模板取自SICPpg 107