计划淘汰

Planned obsolescence

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 的过程中隐藏了。请原谅我想讲个好故事的冲动。
²)这不是谎言。

comments powered by Disqus