为什么Racket对REPL上的突变和同时使用定义窗口和REPL的突变有不同的处理?

为什么Racket对REPL上的突变和同时使用定义窗口和REPL的突变有不同的处理?,racket,read-eval-print-loop,mutation,Racket,Read Eval Print Loop,Mutation,通常,我避免使用突变,因为你很少需要它们 然而,我需要他们,我正试图更好地理解一些事情。有一种特殊的行为引起了我的兴趣,我想请你帮助我更好地理解它 如果我在REPL上键入以下更改,则一切正常: > (define x 1) > (set! x (+ x 1)) > x 2 如果我将赋值和变异放在定义窗口中,它也会起作用: (define y 1) y (set! y (+ y 1)) y 运行文件后,我可以在REPL上看到以下正确结果: 1 2 > 但是,如果我将变

通常,我避免使用突变,因为你很少需要它们

然而,我需要他们,我正试图更好地理解一些事情。有一种特殊的行为引起了我的兴趣,我想请你帮助我更好地理解它

如果我在REPL上键入以下更改,则一切正常:

> (define x 1)
> (set! x (+ x 1))
> x
2
如果我将赋值和变异放在定义窗口中,它也会起作用:

(define y 1)
y
(set! y (+ y 1))
y
运行文件后,我可以在REPL上看到以下正确结果:

1
2
>
但是,如果我将变量
x
的定义放在定义窗口中,并且如果我尝试设置!将其转换为REPL上的新值时,我收到一个错误:

; Definition Window

(define y 1)

;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;

; REPL

> (set! y (+ y 1))
. . y: cannot modify a constant

为什么会这样? 交互式编程不应该特别用于这种情况吗

提前感谢。

据了解,到目前为止,球拍开发的主要负责人之一:

DrRacket REPL允许设置!这些变量在模块中是可分配的,没有其他变量。那是故意的。粗略地说,把定义窗口看作是一个模块,把REPL看作是一种执行计算的方式,就像我们是模块的客户机一样,它也可以使用所有内部定义的函数,比如超级客户机。但是这个超级客户机视图不允许您改变最初不可变的变量。。就像客户也不能那样做一样

正如我在上面的帖子中对自己的问题的评论所指出的,这些信息是在7年前提供的。

也许可以看到(我不知道racket)。