Scheme 方案全局变量赢得';不变

Scheme 方案全局变量赢得';不变,scheme,racket,Scheme,Racket,我对Scheme还很陌生,目前正在Racket博士学习。所以基本上我的问题是,我无法永久地改变全局变量 这是我的更改功能: (define (change b) (set! b (- b 1)) b) (define (change b) (set-box! b (- (unbox b) 1)) b) 正如您所注意到的,我在函数末尾返回a的值。 这是控制台上的输出 > (define a 4) > (change a) 3 > a 4 如您所见,在函数中,它返回了

我对Scheme还很陌生,目前正在Racket博士学习。所以基本上我的问题是,我无法永久地改变全局变量

这是我的更改功能:

(define (change b)
  (set! b (- b 1)) b)
(define (change b)
  (set-box! b (- (unbox b) 1)) b)
正如您所注意到的,我在函数末尾返回a的值。 这是控制台上的输出

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

如您所见,在函数中,它返回了值3(4-1)。但是,当我在函数后面调用全局变量时,它似乎并没有改变。我怎样才能让它改变?提前感谢。

您并没有真正更改全局变量!您只是在修改一个参数,实际上它是一个局部变量。如果要修改全局参数,请不要将其作为参数传递:

(define a 4)

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

a
=> 4
(change)
=> 3
a
=> 3

你没有真正改变全局变量!您只是在修改一个参数,实际上它是一个局部变量。如果要修改全局参数,请不要将其作为参数传递:

(define a 4)

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

a
=> 4
(change)
=> 3
a
=> 3

首先,敲诈不是阴谋。在本例中,它们都很相似,但它们是非常不同的语言。称它们为同一事物,类似于说C和C++是同一种语言。 现在,让我们来看看你的实际参考资料

change
似乎没有做任何事情的原因是,您正在将“值”传递到
b
,而不是任何实际变量

如果您想要像这样传递一个原语的实际引用,您需要做的是用函数将其框起来。然后,您可以使用来执行实际的变异,并获取框中的值

为您提供以下功能:

(define (change b)
  (set! b (- b 1)) b)
(define (change b)
  (set-box! b (- (unbox b) 1)) b)
现在,当您使用change函数时,变量应该更新

> (define a (box 4))
> (change a)
'#&3
> a
'#&3
> (unbox a)
3
”#&
只是一种简洁的方式,Racket repl表示下一个值在一个框中。这就是为什么取消装箱时我们得到3。)


还有许多其他数据结构也会产生同样的效果,
vector
s、
struct
s等等。但对于单个值来说,
box
是最简单的。

首先,Racket不是Scheme。在本例中,它们都很相似,但它们是非常不同的语言。称它们为同一事物,类似于说C和C++是同一种语言。 现在,让我们来看看你的实际参考资料

change
似乎没有做任何事情的原因是,您正在将“值”传递到
b
,而不是任何实际变量

如果您想要像这样传递一个原语的实际引用,您需要做的是用函数将其框起来。然后,您可以使用来执行实际的变异,并获取框中的值

为您提供以下功能:

(define (change b)
  (set! b (- b 1)) b)
(define (change b)
  (set-box! b (- (unbox b) 1)) b)
现在,当您使用change函数时,变量应该更新

> (define a (box 4))
> (change a)
'#&3
> a
'#&3
> (unbox a)
3
”#&
只是一种简洁的方式,Racket repl表示下一个值在一个框中。这就是为什么取消装箱时我们得到3。)


还有很多其他的数据结构也会有同样的效果,
vector
s,
struct
s等等。但是对于单个值,
box
是最简单的。

我知道Clojure,不是Racket,但它看起来像是你创建了一个全局符号
a
,然后命名
change
的参数,并更改本地
a
。此外,这看起来不像是一种非常实用的处理事情的方式。应该像瘟疫一样避免全局变量的变异。不,我尝试更改变量名以延迟,但在C中不起作用,如果您使一个变量
inta=5
,然后将
a
传递给一个函数,其中变量绑定到
b
,在该函数中执行
b=b+1
,为什么全局变量
a
不会改变?同样的答案也适用于Scheme。我知道Clojure,而不是Racket,但它看起来像是创建了一个全局符号
a
,然后命名
change
的参数,然后更改本地
a
。而且,这看起来不是一种非常实用的方式。应该像瘟疫一样避免全局变量的变异。不,我尝试更改变量名以延迟,但在C中不起作用,如果您使一个变量
inta=5
,然后将
a
传递给一个函数,其中变量绑定到
b
,在该函数中执行
b=b+1
,为什么全局变量
a
不会改变?同样的答案也适用于该方案。