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

Documentation Perl 6程序必须编译才能读取嵌入式文档吗?,documentation,raku,Documentation,Raku,Perl 6普通的旧文档(可能是新奇的新文档)具有一些特性,允许它为所看到的东西构造文档,并且文档在运行时显示在$=pod变量中 然而,当我在程序文本中出错而无法阅读文档时,我感到惊讶。在这里,我省略了两个语句之间的语句分隔符: use v6; BEGIN { put "BEGIN" } INIT { put "INIT" } CHECK { put "CHECK" } "foo" "bar"; DOC INIT { put "DOC INIT" } DOC BEGIN { put "

Perl 6普通的旧文档(可能是新奇的新文档)具有一些特性,允许它为所看到的东西构造文档,并且文档在运行时显示在
$=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
当我使用
--doc
开关运行它时,程序语法很重要(并且
开始
运行):

当我修复它时,我会收到一些警告(因此,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
我们已经知道这在Perl5中有点危险。
perl-c
BEGIN
块可以运行代码。看见我不认为这比我们已经知道的更危险,但现在它发生在我没有明确要求编译程序语句的时候


我还没有深入研究Perl 6 pod的细节,以及为什么在声明程序块和
之外可能需要这样做。为什么
(一个很酷的特性),但这似乎会导致麻烦。是否有可能提取Pod的外部程序?或者一种不使用声明符的方法,除非程序将运行?

是的,必须解析整个文件,这反过来需要运行
BEGIN
use
语句等

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

考虑如下代码:

say "

=begin pod

Not POD, just a string!

";
如果您只是grep文件中的POD语句,而没有对其进行全部解析,则会误解这段代码

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


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

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


您可以总是向拉里和其他Perl 6设计器提交一个特性请求来考虑这一点。

我不做特征请求。我只是在解释存在什么。
say "

=begin pod

Not POD, just a string!

";