Perl6:模块与包,模块和包

Vad*_*man 8 perl6

我正在寻找一些清理我的知识.在具有复杂模块结构的项目中,我希望通过构建结构化命名空间树来保持结构清洁.说,像:

App
  Config
    Key
    Node
    Param
    Type
      MyType
Run Code Online (Sandbox Code Playgroud)

App :: Config下的每个条目都应包含在自己的文件中.总是输入类似的东西App::Config::Key是浪费时间.is export没有参数来声明要导出的名称.所以,我终于找到了以下解决方案:

Config.pm6:

unit module App::Config:ver<0.0.1>;
...
Run Code Online (Sandbox Code Playgroud)

Key.pm6:

unit package App::Config;

class Key is export {
    ...
}
Run Code Online (Sandbox Code Playgroud)

它按我想要的方式工作:

use App::Config::Key;

say Key.^name; # App::Config::Key
Run Code Online (Sandbox Code Playgroud)

唯一的问题仍然存在:有任何警告吗?知道任何隐藏的副作用?

jjm*_*elo 0

据我所知,唯一的问题似乎是你只能以这种方式递归地声明模块。只有一个,在顶层,是可能的。请参阅这个(简化的)示例:

lib/Packr/U/Packd.rakumod:

unit package Packr::U;

our class Pack'd is export {}
Run Code Online (Sandbox Code Playgroud)

lib/Packr/U.rakumod:

unit module Packr::U;
Run Code Online (Sandbox Code Playgroud)

lib/Packr/Packd.rakumod:

unit package Packr;

our class Pack'd is export {}

our class B::Pack'd is export {}
Run Code Online (Sandbox Code Playgroud)

lib/Packr.rakumod:

unit module Packr::U;
Run Code Online (Sandbox Code Playgroud)

然后是主程序:

use Packr;
use Packr::U;

for (Packr::Pack'd Packr::B::Pack'd Packr::U::Pack'd ) -> \P {
    say P.new().raku;
}
Run Code Online (Sandbox Code Playgroud)

这在最后一个迭代类中失败:

Could not find symbol '&Pack'd' in 'Packr::U'
Run Code Online (Sandbox Code Playgroud)