为什么Racket对REPL上的突变和同时使用定义窗口和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 > 但是,如果我将变
> (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)。