提问者:小点点

有没有办法安全地重新声明一个符号?


我经常发现自己在REPL中进行实验,我会说这样的话:

Int的子集Bar,其中*%%57;

然后我在Bar上进行了一些检查。

一切都很快乐,直到我意识到我想改变Bar的定义。

如果我只是重新定义Bar,我会得到一个重新声明符号异常。

我尝试使用MONKEY-TYPING增强,如下所示:

use MONKEY-TYPING;
augment subset Bar of Int where * %% 37;

但这让我犯了同样的错误。

为什么我想要这个?这样我就可以迭代我的子集(或类或其他符号)定义,同时重用我已经键入的历史记录中的测试。


共2个答案

匿名用户

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,那么对于subsetclass声明,将使用our,并且由于our实际上是my将符号添加到封闭包中…;事实证明,如果您从包中删除符号,您可以稍后再次隐藏它:

subset Bar of Int where * %% 57;
GLOBAL::<Bar>:delete;
subset Bar of Int where * %% 42;
42 ~~ Bar;

注意:这些结果只是来自我在REPL中的实验。我不确定是否有其他未知的副作用。