如何改变变量方案

时间:2018-03-10 19:52:15

标签: scheme lisp racket r5rs mutability

我正在尝试使用可变对象对作业进行求和。这里使用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)时,它会按预期返回3我的问题为什么在运行时,caddr在应用(mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))后生成+但未应用时返回3

我正在使用R5RS 编辑:我省略了一些简洁的if语句

1 个答案:

答案 0 :(得分:1)

好的,所以我认为使用完全不同的实现 @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第107页