我经常发现自己在REPL中进行实验,我会说这样的话:
Int的子集Bar,其中*%%57;
然后我在Bar
上进行了一些检查。
一切都很快乐,直到我意识到我想改变Bar
的定义。
如果我只是重新定义Bar
,我会得到一个重新声明符号
异常。
我尝试使用MONKEY-TYPING
和增强
,如下所示:
use MONKEY-TYPING;
augment subset Bar of Int where * %% 37;
但这让我犯了同样的错误。
为什么我想要这个?这样我就可以迭代我的子集(或类或其他符号)定义,同时重用我已经键入的历史记录中的测试。
REPL
有其缺点。它是尝试协同工作的EVAL
语句的精心构建。有时这行不通。
我想我们能做的最好的事情就是引入一个REPL命令,让它忘记以前做过的一切。欢迎补丁!:-)
我认为REPL通过EVAL
-在新的嵌套词法范围内处理每个新输入来实现它的部分魔力。因此,如果您使用my
声明事物,那么您可以使用稍后输入的声明来隐藏它们:
my subset Bar of Int where * %% 57;
sub take-Bar(Bar $n) { say "$n is Bar" }
take-Bar 57;
my subset Bar of Int where * %% 42;
sub take-Bar(Bar $n) { say "$n is Bar" }
take-Bar 42;
如果您省略my
,那么对于subset
和class
声明,将使用our
,并且由于our
实际上是my
将符号添加到封闭包中…;事实证明,如果您从包中删除符号,您可以稍后再次隐藏它:
subset Bar of Int where * %% 57;
GLOBAL::<Bar>:delete;
subset Bar of Int where * %% 42;
42 ~~ Bar;
注意:这些结果只是来自我在REPL中的实验。我不确定是否有其他未知的副作用。