Scheme全局变量不会改变

时间:2017-03-09 23:49:33

标签: scheme racket

我是Scheme的新手,我目前正在DR Racket学习它。所以基本上我的问题是我在永久改变全局变量方面遇到了麻烦。

这是我的更改功能:

(define (change b)
  (set! b (- b 1)) b)

您可以注意到我在函数末尾返回a的值。 这是控制台上的输出。

> (define a 4)
> (change a)
3
> a
4

如您所见,在函数中它返回值3(4 - 1)。但是当我在函数之后调用它时,似乎全局变量实际上并没有改变。我如何改变它?提前谢谢。

2 个答案:

答案 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