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

bri*_*foy 6 module perl6

有时我不想要多个文件,特别是如果我正在玩一个想法,我想保持一个可以在以后变成某种东西的漂亮结构.我想做这样的事情:

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

foo( 137 );
Run Code Online (Sandbox Code Playgroud)

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

===SORRY!=== Error while compiling /Users/brian/Desktop/multi.pl
Undeclared routine:
    foo used at line 9
Run Code Online (Sandbox Code Playgroud)

阅读Perl 6"模块"文档,我没有看到任何方法来执行此操作,因为各种动词想要查看特定文件.

Chr*_*oph 7

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

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

import Foo;
foo( 137 );
Run Code Online (Sandbox Code Playgroud)

只是为了记录,您还可以&foo在主线中手动声明一个变量并从模块中分配给它:

my &foo;

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

    &OUTER::foo = &foo;
}

foo( 137 );
Run Code Online (Sandbox Code Playgroud)

  • 请注意,设计文档不符合6.c的实际情况:`import`不支持没有明确的`&EXPORT`子的位置符号名称,只是标记为`:adverbs` (3认同)
  • 有[设计文档](http://design.perl6.org/S11.html#Importing_without_loading)和[用户文档](http://doc.perl6.org/language/modules); 对于这个特定情况,设计文档更清晰 (2认同)