我正在尝试使用可变对象对一个列表进行求和。这里使用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

07-25 22:27