如何在运行时在 Raku 中动态访问模块的符号 table?

How do I access a module's symbol table dynamically at runtime in Raku?

我希望能够将我的脚本传递到 .rakumod 文件的路径,比如 <blah>/Mod.rakumod,并且能够访问符号 table 作为散列,就像我'd used 模块改为:

模块:

$ cat Mod.rakumod
unit module Mod;
sub bag        is export             { ... }
use lib <dir-containing-Mod>
use Mod;
say Mod::EXPORT::.keys

有效,作为 expected,返回 (ALL DEFAULT)

另一方面:

use lib <dir-containing-Mod>
require Mod;
say Mod::EXPORT::.keys

失败

Could not find symbol '&EXPORT' in 'Mod'
  in block <unit> at <blah>

尽管事实上即使使用 requiresay Mod::.keys 也确实看到 EXPORT:

use lib <dir-containing-Mod>
require Mod;
say Mod::.keys
---
(EXPORT Mod)

我需要使用 require 来制作这个 dynamic,因为我不知道我需要哪个模块。


可以居然想到一件事去做,但是绝对恶心:

my $mod = <whatever>
my $cd = qq:to/END/;
use v6;
use lib qq\|$\*CWD\|;
use $mod;

say {$mod}::EXPORT::ALL::.keys;
END

'aux.p6'.IO.spurt($cd);
shell("raku aux.p6")

什么有效,根据 (我已经接受并在这里解释):

my $dir = $path.IO.dirname;
use lib $dir;
my $modFile = S/(.*)\..*/[=19=]/ with $path.IO.basename;
require ::($modFile);
say ::("{$modFile}::EXPORT::ALL").WHO.keys;

运行 和 <script> <path> 返回 (&bag) 没问题。


实际上,上面的方法并不完全有效:use lib $dir 会失败,说 $dir 是空的,因为 use lib 不是动态的。

所以我现在求助于

这个没有吸引力的解决方案

TL;DR 使用动态符号查找在运行-时间获取您想要的包的符号;然后 .WHO 得到它的藏品;然后 .keys 获取该存储的符号。

例如:

use lib '.';
require Mod;
say ::Mod::EXPORT::('ALL').WHO.keys; # (&bag)

我去做早餐了。稍后我会详细说明。