2016-12-01 9 views
8

Perl 6 Plain-Old-Documentation(おそらくファンシー・ニュー・ドキュメンテーション)には、見えるもののドキュメントを作成できるいくつかの機能があり、ドキュメントは実行時に変数$=podに表示されます。埋め込みドキュメントを読み込むためにPerl 6プログラムをコンパイルする必要はありますか?

しかし、プログラムのテキストに誤りがあったときにドキュメントを読むことができなかったのに驚きました。私は--docスイッチ、プログラムの構文事項(およびBEGIN実行)でそれを実行すると

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 

$ 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 

私はそれを修正すると、ここで私は2つの文の間の文の区切りを残してきました、私は(そう、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 0123に少し危険です知っていますとBEGINブロックでコードを実行できます。 How to check if a Perl script doesn't have any compilation errors?を参照してください。私はこれが既に知られているものよりも危険ではないとは思わないが、今は明示的にプログラムのステートメントをコンパイルすることを求めていないときに起きている。

私はPerl 6ポッドの詳細を掘り下げませんでしたし、なぜ宣言子ブロックと.WHY(クールな機能)の外で必要になるのでしょうか?これはトラブルにつながる可能性があります。おそらく、ポッドを抽出する外部プログラムはありますか?または、プログラムが実行されない限り宣言子なしでやる方法?

答えて

1

はい、ファイル全体を解析する必要があります。それには、BEGINuseなどの文を実行する必要があります。

Perl 6の言語は、上から下への1パス解析のために設計されているので、パーザは今まで解析した内容に基づいて解析する内容を任意の時点で理解します。

say " 

=begin pod 

Not POD, just a string! 

"; 

あなたはそれのすべてを解析せずにPOD文のファイルをgrepしたい場合は、コードのこの部分を誤って解釈します:

は、次のようなコードを考えてみましょう。

I.e.通常のPerl 6コードパーツを解析せずにPODパーツだけを解析することはできません。なぜなら、すべてを上から下に解析することなく、どのパーツがどのパーツであるかを知ることができないからです。


PS:理論的には、Perl 6の設計者はPOD-のみ、彼らはPODブロックを開始するような行が含まれるように、通常のPerl 6のコードのために、それは違法することによって、パースを収容した可能性があります。このシナリオでは、=begin podの文字列リテラル内の行を開始することができないため、--podスイッチは=begin fooで始まるすべての行を実際に開始する可能性があるため、上記のコードスニペットはファイル全体が解析されると構文エラーになります。 PODブロック。

このような制限は、おそらく通常のPerl 6(リテラル複数行の文字列の行の先頭に=begin podを書くことを必要とするすべての後に、)コードが、ノートの主要な負担ではないでしょう1パストップトゥボトム解析アーキテクチャの理由の1つは、スラングによる言語拡張を容易にすることです。
など。 CPANモジュールは、別の言語またはDSLで1つのサブルーチン(または他のレキシカルスコープ)を書くユーザのサポートを追加することができます。 (実際にこのようなモジュールを実装することは、NQPを介してRakudoの内部構造をハッキングすることなく可能ですが、マクロ/スラングの設計が完了した後は可能になります)。
PODブロックを開始するように見える行を拒否する負担は、すべてのスラングパーサーに渡されます。

Larryと他のPerl 6デザイナーには、いつでもこれを考慮する機能要求を提出できます。

+0

私は機能要求をしていません。私は単に存在するものを説明しているだけです。 –

関連する問題