Playing with the code of Rakudo Raku

昨天,我们查看了返回字符串的 Bool 类的两个方法。函数产生的字符串表示在源代码中被硬编码。

让我们使用这个观察并尝试改变文本。

所以,这里是我们要修改的片段:

Bool.^add_multi_method('gist', my multi method gist(Bool:D:) {
    self ?? 'True' !! 'False'
});

gist 方法用于对已定义的变量进行字符串化。

要做到这一点,你需要在计算机上安装 Rakudo 的源代码,以便编译它们。首先从 GitHub 克隆项目:

$ git clone https://github.com/rakudo/rakudo.git

编译 MoarVM:

$ cd rakudo
$ perl Configure.pl --gen-moar --gen-nqp --backends=moar
$ make

完成之后,你会在 rakudo 目录下获得 raku 可执行文件。

现在,打开 src/core/Bool.pm 文件,并将 gist 方法的字符串更改为使用 Unicode 大拇指代替纯文本:

Bool.^add_multi_method('gist', my multi method gist(Bool:D:) {
    self ?? '👍' !! '👎'
});

保存文件后,您需要重新编译 Rakudo。 Bool.pm 位于要在 Makefile 中编译的文件列表中:

M_CORE_SOURCES = \
    src/core/core_prologue.pm\
    src/core/traits.pm\
    src/core/Positional.pm\
    . . .
    src/core/Bool.pm\
    . . .

运行 make 并获取更新的 raku。运行它并享受结果:

:~/rakudo$ ./raku
To exit type 'exit' or '^D'
> my Bool $b = True;
👍
> $b = !$b; 
👎
>

作为练习,让我们通过添加未定义值的 gist 方法来改进本地 Raku。默认情况下,它不存在,我们昨天看到了。这意味着尝试在字符串中插入未定义的变量将被拒绝。让我们做得更好。

插值使用 Str 方法。它与 gistperl 类似,所以在创建新版本时不会遇到任何困难。

这是目前在 Raku 中的内容:

Bool.^add_multi_method('Str', my multi method Str(Bool:D:) {
    self ?? 'True' !! 'False'
});

这是你需要添加的内容:

Bool.^add_multi_method('Str', my multi method Str(Bool:U:) {
    '¯\_(ツ)_/¯'
});

请注意,第二个变体中不需要 self(不能使用)。

编译并运行 raku

$ ./raku
To exit type 'exit' or '^D'
> my Bool $b;
(Bool)
> "Here is my variable: $b"
Here is my variable: ¯\_(ツ)_/¯
>

它按预期工作。恭喜,你刚刚改变了 Raku 的行为!

Raku 

comments powered by Disqus