12年前¹,拉里策划了我的一个模块的报废。他的狡猾计划在两周前被 lizmat 执行了。如果你是从源码开始构建 Rakudo,你现在可以走另一条捷径。
use v6.e.PREVIEW;
my %detectives;
my @a = <UK London Bakerstreet>;
%detectives{||@a} = "Holms";
say %detectives{||<UK London Bakerstreet>};
dd %detectives;
# OUTPUT: Holms
Hash %detectives = {:UK(${:London(${:Bakerstreet("Holms")})})}
在处理解析 JSON 时,Slippy 半列表是相当有用的。有很多哈希的哈希。
现在我遇到了一个奇特的问题。我的一个模块变得多余了,如果–而且只有当–要求一个比 v6.d
更年轻的 Raku 版本时。
use v6.e.PREVIEW;
say $*RAKU.version ~~ v6.e+;
# OUTPUT: True
我们可以用它来触发模块中的警告,只要 v6.e
成为默认值。
use v6;
CHECK if $*RAKU.version ~~ v6.e+ { warn "Unattended items will be destroy without warning! (This is a warning.)" };
这个警告会在每次预编译时显示一次,所以很容易被忽略。即使运行使用声明的程序可能需要一个旧版本的 Raku,它也会显示出来。如果有一个子程序,每次我们在调用者的上下文中导入一个模块时都会被调用的话,那就好了。
use v6.d;
sub EXPORT {
if $*RAKU.version ~~ v6.e+ { warn "Unattended items will be destroy without warning! (This is a warning.)" };
%()
}
现在使用可以通过查询动态变量 $*RAKU
来检测时间旅行。
use v6.e.PREVIEW;
use warner;
# OUTPUT: Unattended items will be destroy without warning! (This is a warning.)
in sub EXPORT at /home/dex/projects/raku/obsolescence/lib/warner.rakumod (warner) line 6
Raku 能够修正过去的错误,从一开始就计划好了²。我觉得已经为下一个100年做好了准备。
¹)这是个谎言。真相被从 SVN 转移到 git 的过程中隐藏了。请原谅我想讲个好故事的冲动。
²)这不是谎言。