Perl 6程序是否必须编译才能读取嵌入式文档?

bri*_*foy 10 documentation perl6

Perl 6 Plain-Old-Documentation(可能是Fancy-New-Documentation)具有一些功能,允许它为它看到的东西构建文档,并且文档$=pod在运行时显示在变量中.

但是,当我在程序文本中出错时,我无法阅读文档时感到很惊讶.这里我省略了两个语句之间的语句分隔符:

use v6;

BEGIN { put "BEGIN" }
INIT  { put "INIT" }
CHECK { put "CHECK" }

"foo" "bar";

DOC INIT  { put "DOC INIT" }
DOC BEGIN { put "DOC BEGIN" }
DOC CHECK { put "DOC CHECK" }

=begin pod

=head1 This is a title

This is a bit of pod

=end pod
Run Code Online (Sandbox Code Playgroud)

当我使用--doc开关运行它时,程序语法很重要(并BEGIN运行):

$ perl6 --doc doc.p6
BEGIN
===SORRY!=== Error while compiling ...
Two terms in a row
------>     "foo"? "bar";
    expecting any of:
        infix
        infix stopper
        statement end
        statement modifier
        statement modifier loop
Run Code Online (Sandbox Code Playgroud)

当我修复它时,我得到一些警告(因此,perl6正在编译)并且编译时阶段运行:

BEGIN
DOC BEGIN
DOC CHECK
CHECK
WARNINGS for /Users/brian/Desktop/doc.p6:
Useless use of constant string "bar" in sink context (line 9)
Useless use of constant string "foo" in sink context (line 9)
INIT
DOC INIT
This is a title

This is a bit of pod
Run Code Online (Sandbox Code Playgroud)

我们已经知道这在Perl 5中有点危险.A perl -cBEGIN块可以运行代码.请参见如何检查Perl脚本是否没有任何编译错误?.我不认为这比我们已经知道的更危险,但现在它发生在我没有明确要求编译程序语句的时候.

我没有深入研究Perl 6 pod的细节以及为什么在声明器块和.WHY(一个很酷的功能)之外这可能是必要的,但似乎这会导致麻烦.是否有可能提取Pod的外部程序?或者除非程序运行,否则没有声明器的方法?

sml*_*mls 4

是的,必须解析整个文件,这又需要运行BEGINuse语句等。

Perl 6 语言被设计为从上到下的一次性解析,因此在任何给定点解析器都可以根据迄今为止解析的内容来理解它正在解析的内容。

考虑如下代码:

say "

=begin pod

Not POD, just a string!

";
Run Code Online (Sandbox Code Playgroud)

如果您只是 grep 文件中的 POD 语句而不解析所有内容,它会误解这段代码。

也就是说,你不能只解析 POD 部分而不解析正常的 Perl 6 代码部分,因为如果不从上到下全部解析,你就无法知道哪个是哪个。


PS:理论上,Perl 6 设计者可以通过使普通 Perl 6 代码包含看起来像是开始 POD 块的行变得非法,来适应仅 POD 解析。=begin pod在这种情况下,当解析整个文件时,上面的代码片段将是一个语法错误,因为不允许在字符串文字中开始一行,因此--pod开关可以依赖于以=begin foo实际启动 POD 块开头的所有行。

这样的限制可能不会成为普通 Perl 6 代码的主要负担(毕竟,谁需要=begin pod在多行字符串文字的行开头编写) ,但请注意,原因之一 -通过自上而下的解析架构是为了通过俚语促进语言的可扩展性。
例如,CPAN 模块可以添加对用户用另一种语言或 DSL 编写单个子例程(或其他词法范围)的支持。(如果不通过 NQP 侵入 Rakudo 内部,实现此类模块实际上是不可能的,但一旦宏/俚语设计完成,它就会实现)。
禁止看起来像是开始 POD 块的行的负担将被传递给所有这些俚语解析器。

不过,您始终可以向 Larry 和其他 Perl 6 设计者提交功能请求来考虑这一点。