我正在尝试使用可变对象对作业进行求和。这里使用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语句
答案 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页