我是Scheme的新手,我目前正在DR Racket学习它。所以基本上我的问题是我在永久改变全局变量方面遇到了麻烦。
这是我的更改功能:
(define (change b)
(set! b (- b 1)) b)
您可以注意到我在函数末尾返回a的值。 这是控制台上的输出。
> (define a 4)
> (change a)
3
> a
4
如您所见,在函数中它返回值3(4 - 1)。但是当我在函数之后调用它时,似乎全局变量实际上并没有改变。我如何改变它?提前谢谢。
答案 0 :(得分:3)
首先,Racket不是Scheme。它们在这个例子中都很相似,但它们是非常不同的语言。调用它们是相同的,就像说C和C ++是同一种语言。
现在,您的实际参考资料。
change
似乎没有做任何事情的原因是因为您传递的是“'值”'进入b
,而不是任何实际变量。
如果你想传递这样一个原语的实际引用,你需要做的就是用box
函数对它进行包装。然后你可以使用set-box!
进行实际的变异,并使用unbox
来获取框中的值
为您提供以下功能:
(define (change b)
(set-box! b (- (unbox b) 1)) b)
现在,当您使用更改功能时,变量应该更新。
> (define a (box 4))
> (change a)
'#&3
> a
'#&3
> (unbox a)
3
('#&
只是一种紧凑的方式,Racket repl说下一个值在一个方框中。这就是为什么我们在你取消装箱时得到3。)
有很多其他数据结构具有相同的效果,vector
s,struct
等等。但对于单个值box
是最简单的。
答案 1 :(得分:2)
你并没有真正改变全局变量!你只是修改一个参数,这个参数实际上就是一个局部变量。如果要修改全局值,请不要将其作为参数传递:
(define a 4)
(define (change)
(set! a (- a 1))
a)
a
=> 4
(change)
=> 3
a
=> 3