我该如何在同一个文件中声明和使用Perl 6模块?

6
有时候我不想要多个文件,特别是当我在尝试一个想法,并且希望保持良好的结构以备将来使用时。我想做这样的事情:
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

阅读 Perl 6“模块”文档,我没有看到任何方法可以做到这一点,因为各种动词想要查找特定的文件。

我得到了一个编译错误(对于一种动态语言来说,我认为这有点奇怪)。你是否浏览过jnthn的出色PDF超越静态与动态?(当时jnthn病了,还有其他小问题,所以他的现场演讲不太好,但还可以)。 - raiph
@raiph 我很久以前就读过这个,但我认为你需要说更多的话来表达观点。 - brian d foy
Perl 6在某种程度上是一种静态语言,例如通常能够在编译时进行类型检查和多子例程(例如运算符)以及私有方法的分派解析。我认为你所说的“奇怪”意味着你没有看到这方面的东西,并想知道你是否看过jnthn的演示。 - raiph
1个回答

7

子程序声明是词法作用域的,因此&foo在模块的主体外部是不可见的。您需要在主线程代码中添加导入语句才能使其可见:

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 );

1
“import” 是我正在寻找的内容。它在哪里有文档记录? - brian d foy
2
设计文档用户文档; 对于这个特定的情况,设计文档更加清晰明了。 - Christoph
3
请注意,设计文档与6.c的实际情况不符:import不能支持没有显式&EXPORT子例程的位置符号名称,只能通过命名为:adverbs的标签来支持。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接