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

时间:2019-11-15 21:00:12

标签: raku

我经常发现自己在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;

但是那使我陷入了同样的错误。

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

2 个答案:

答案 0 :(得分:7)

REPL有其缺点。它是EVAL语句的精心构建,它们试图一起工作。有时那行不通。

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

答案 1 :(得分:3)

我认为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中的实验。我不确定是否还有其他未知的副作用。