【问题标题】:Do Perl 6 programs have to compile to read embedded docs?Perl 6 程序是否必须编译才能读取嵌入式文档?
【发布时间】:2016-12-01 09:39:26
【问题描述】:

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

当我使用--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

当我修复它时,我收到了一些警告(因此,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

我们已经知道这在 Perl 5 中有点危险。perl -c 和 BEGIN 块可以运行代码。见How to check if a Perl script doesn't have any compilation errors?。我不认为这比我们已经知道的更危险,但现在它发生在我没有明确要求某些东西来编译程序语句的时候。

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

【问题讨论】:

    标签: documentation raku


    【解决方案1】:

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

    Perl 6 语言设计用于从上到下一次性解析,因此在任何给定点解析器都根据它目前已解析的内容了解它正在解析的内容。。 p>

    考虑如下代码:

    say "
    
    =begin pod
    
    Not POD, just a string!
    
    ";
    

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

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


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

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

    不过,您可以随时提交功能请求,让 Larry 和其他 Perl 6 设计人员考虑这一点。

    【讨论】:

    • 我没有提出功能请求。我只是在解释存在什么。
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 2015-09-01
    • 2014-07-13
    • 2014-03-23
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多