我如何检查 Perl 6 模块?

How can I inspect a Perl 6 module?

在另一个问题()中,我有这样的代码:

module Foo {
    sub foo ( Int:D $number ) is export {
        say "In Foo";
        }
    }

foo( 137 );

我想检查 Foo 模块以查看它是否已定义以及其中可能包含哪些内容以进行一些调试。由于 Foo 是一个模块而不是 class,元方法有意义吗?

此外,我认为曾经有一种方法可以在 class 中获取方法列表。我想获得模块中的子例程列表。那将是一种测试我是否定义了正确的东西并且 Perl 6 知道它们的方法。在我的 Perl 5 东西中,我经常测试我是否定义了一个子例程,因为我有一段时间会在模块中选择一个名称,并在测试中选择一个稍微不同的名称(我想就像昨晚一样, valid_valueis_value_value)。如果我可以测试 foo 是否已定义,我可以在这里进行一些调试。

您可以通过在其名称中添加尾随 :: 来获取包的符号 table。这将适用于模块和 类 两者,但在 类 的情况下将不包含任何方法,因为它们与类型对象而不是包本身相关联。

符号table的类型是Stash,是关联的(即支持hash-like运算):

module Foo {
    sub foo is export { ... }
    sub bar is export(:bar) { ... }
    our sub baz { ... }
}

# inspect the symbol table
say Foo::.WHAT;       #=> (Stash)
say Foo::.keys;       #=> (EXPORT &baz)
say Foo::<&baz>.WHAT; #=> (Sub)

# figure out what's being exported
say Foo::EXPORT::.keys;          #=> (bar DEFAULT ALL)
say Foo::EXPORT::bar::.keys;     #=> (&bar)
say Foo::EXPORT::DEFAULT::.keys; #=> (&foo)
say Foo::EXPORT::ALL::.keys;     #=> (&bar &foo)