问题描述
通常,我避免使用突变,因为您很少需要它们。
但是,我需要它们并且我正在尝试更好地理解某些东西。有一个特定的行为引起了我的兴趣,我想请求您的帮助以更好地理解它。
如果我在 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 年前提供的,正如我在上面帖子中对我自己问题的评论中所指出的那样。