如何改变变量方案
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
我正在尝试使用可变对象对列表求和以进行赋值。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