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

问题描述

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

但是,我需要它们并且我正在尝试更好地理解某些东西。有一个特定的行为引起了我的兴趣,我想请求您的帮助以更好地理解它。

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

_.sample(['January','February','march'])

如果我把赋值和变异放在定义窗口上,它也可以工作:

> (define x 1)
> (set! x (+ x 1))
> x
2

运行文件后,我可以在 REPL 上看到以下正确结果:

(define y 1)
y
(set! y (+ y 1))
y

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

x

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

提前致谢。

解决方法

Matthias Felleisen介绍,目前负责 Racket 开发的主要负责人之一:

DrRacket REPL 允许在模块中可分配的变量上设置!那是设计使然。粗略地说,将定义窗口视为一个模块,而 REPL 是一种执行计算的方法,就好像我们是模块的客户端,也可以使用其所有内部定义的函数,想想超级客户端。但是这个超级客户端视图并不能让你改变一开始不可变的变量......就像客户端也不能这样做一样。

此信息是在 Racket's Mail list 7 年前提供的,正如我在上面帖子中对我自己问题的评论中所指出的那样。