如何在与程序相同的文件中声明和使用 Perl 6 模块?

How can I declare and use a Perl 6 module in the same file as the program?

有时我不想要多个文件,尤其是当我想保留一个可以在以后变成某些东西的好结构时。我想做这样的事情:

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

foo( 137 );

运行 这个,我得到一个编译错误(我认为这对于动态语言来说有点奇怪):

===SORRY!=== Error while compiling /Users/brian/Desktop/multi.pl
Undeclared routine:
    foo used at line 9

正在阅读 the Perl 6 "Modules" documentation,我看不出有什么方法可以做到这一点,因为各种动词都想在特定文件中查找。

子例程声明是词法的,因此 &foo 在模块主体之外是不可见的。需要在主线代码中添加import语句使其可见:

module Foo {
    sub foo ( Int:D $number ) is export { ... }
}

import Foo;
foo( 137 );

郑重声明,您也可以在主线中手动声明一个 &foo 变量并从模块中分配给该变量:

my &foo;

module Foo {
    sub foo ( Int:D $number ) { ... } # no export necessary

    &OUTER::foo = &foo;
}

foo( 137 );