set!可以改变一个变量的定义,但是它只能改变一个模块内部自己的定义,它无法改变导入的绑定。
如果一个模块想授权其它模块改变自己的导出,可以导出自己的可变函数来改变自己的导出。
禁止分配导入变量可以支持模块化,而且可以使程序执行更有效率。
如果在模块里的一个标识符没有调用set!,那么这个标识符可以被当做常量。
一般情况下重定义不被允许。基于文件的模块,简单修改文件不会在任何情况下重定义。因为文件模块在需要的时候被加载,而且之前加载的定义之后也可以使用。使用racket反射可以重定义一个模块。在repl中,非文件模块可以之定义,但是在重定义之前绑定引用,也会使重定义失败。
为了测试的目的,racket反射层提供了一个参数compile-enforce-module-constants解除常量约束。
网友评论