如何改变变量方案

How To Mutate Variables Scheme

我正在尝试使用可变对象对列表求和以进行赋值。let 用于允许我改变 x 总和和 counter。我不是很精通方案,因此对列表中的每个数字使用 if 语句 lst:

(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...:

然而,当我检查 (caddr lst) 时,它 returns 和预期的一样 3我的问题是为什么当 运行 应用到 +caddr 会产生 (mcons 2 (mcons 3 (mcons 4 (mcons 5 '())))) 但不应用时 returns 3

我用的是R5RS 编辑:为简洁起见,我省略了一些 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 遍历整个循环时改变它。函数模板取自 SICP pg 107