有没有办法安全地重新声明符号?
Is there a way to safely redeclare a symbol?
我经常发现自己在 REPL 中进行试验,我会这样说:
subset Bar of Int where * %% 57;
然后我会检查 Bar
-ness 一段时间。
一切都很开心,直到我意识到我要改变Bar
的定义。
如果我只是重新定义 Bar
,我会得到一个 Redeclaration of symbol
异常。
我试过像这样使用 MONKEY-TYPING
和 augment
:
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
,那么对于 subset
和 class
声明,将使用 our
,因为 our
实际上是 my
+ 将符号添加到封闭包中...;事实证明,如果您从包中删除该符号,您可以稍后再次隐藏它:
subset Bar of Int where * %% 57;
GLOBAL::<Bar>:delete;
subset Bar of Int where * %% 42;
42 ~~ Bar;
注意:这些结果仅来自我在 REPL 中的实验。我不确定是否还有其他未知的副作用。
我经常发现自己在 REPL 中进行试验,我会这样说:
subset Bar of Int where * %% 57;
然后我会检查 Bar
-ness 一段时间。
一切都很开心,直到我意识到我要改变Bar
的定义。
如果我只是重新定义 Bar
,我会得到一个 Redeclaration of symbol
异常。
我试过像这样使用 MONKEY-TYPING
和 augment
:
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
,那么对于 subset
和 class
声明,将使用 our
,因为 our
实际上是 my
+ 将符号添加到封闭包中...;事实证明,如果您从包中删除该符号,您可以稍后再次隐藏它:
subset Bar of Int where * %% 57;
GLOBAL::<Bar>:delete;
subset Bar of Int where * %% 42;
42 ~~ Bar;
注意:这些结果仅来自我在 REPL 中的实验。我不确定是否还有其他未知的副作用。