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

Is there a way to safely redeclare a symbol?

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

subset Bar of Int where * %% 57;

然后我会检查 Bar-ness 一段时间。

一切都很开心,直到我意识到我要改变Bar的定义。

如果我只是重新定义 Bar,我会得到一个 Redeclaration of symbol 异常。

我试过像这样使用 MONKEY-TYPINGaugment

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

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

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

REPL有它的缺点。它是试图协同工作的 EVAL 语句的精心构造。有时这行不通。

我想我们能做的最好的事情就是引入一个 REPL 命令,让它忘记之前所做的一切。欢迎补丁! :-)

我认为 REPL 通过 EVAL-ing 新的嵌套词法范围中的每个新输入来发挥其部分魔力。因此,如果您使用 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 中的实验。我不确定是否还有其他未知的副作用。