2016-11-24 17 views
5

ここに、MAINサブルーチンを宣言する短いPerl 6プログラムがあります。ファイルが必要な場合、Perl 6はMAINを実行する必要がありますか?

$ cat main.pm6 
sub MAIN { say "Called as a program!" } 

そして、私は直接プログラムを実行するとき、私は出力を参照してください:

$ perl6 main.pm6 
Called as a program! 

私はモジュールとしてそれをロードする場合、私は何も出力を見ていない私は、直接プログラムを実行する場合、私は唯一の出力が表示されます。同じ

$ perl6 -I. -Mmain -e "say 'Hey'" 
Hey 

私はプログラム内部からそれをuseた場合、私は何も出力を見ていない:

私は requireを使用する場合は210

しかし、私は出力を得る:

$ perl6 -I. -e 'require <main.pm6>' 
Called as a program! 

Synopsis 06を文字通りコンパイル単位は、直接ではなく、を必要とされることによって起動されたと言います。 requireが実行時に機能するので(S06はそれを除外しないにもかかわらず)何かが続いていますか?

私はRakudo Star 2016.07と2016.10で同じ動作をします。

+0

ファイル拡張子を省略すると違いがありますか? – Christoph

+0

私はこれを[email protected]に報告しようとしましたが、メールは恒久的なエラーでバウンスしました。私はそれをPerl NOCに報告しました。 –

+0

@Christoph:requireのファイル拡張子がないと、ファイルが見つかりません。 –

答えて

-1

概要文書は真実のソースではなく、ほとんどの場所で一般に古くなっています。

あなたが使用する/要求する方法は、モジュールのロード方法を変更することもできます。 -Mは 'xxx'コードパスを使用せず、モジュール名ではなくファイル名を使用しても変更されます。 MAINとそのZEF「use'-ES Aモジュールに注意して出力がhttps://github.com/ugexe/zef/blob/master/bin/zef

+0

ですが、 'Zef :: CLI'の' MAIN'がエクスポートされます... – Christoph

+0

あなたは何を言っていますか?文書化された?現在のドキュメントでMAINが何をすべきか、どのように動作すべきかを述べていますか? –

+0

私はそれが文書化されていると言っているわけではありません。ただ存在するものを説明しているだけです。 – ugexe

2

を表示していまずに、のはrequireが動作するようになっているかを見てみましょう:

(非権威)によるとdesign documents

あるいは、ファイル名が現在の語彙の範囲に効果的に匿名でパッケージをインストールした、直接言及することができる、唯一のモジュールがインストールグローバルどんな名前によってアクセスされてもよい。

0を

および

明示的に言及された名前のみをインポートすることができます。字句パッドの実行時の尊厳を守るために、requireで修正することはできません。 S06

と組み合わせて

このコールは、場合にのみ行われる。

A)コンパイル単位は、直接ではなく、別のコンパイル単位の[により必要とされることによって呼び出されました。 ..]

明示的にメインラインレキシカルスコープにインポートされていないサブMAINは実行しないことが私の理解です。

悲しいことに、user documentationは、私はちょうどそれを見逃しているかもしれませんが、どちらかの答えが得られませんでした(特にS11-modules/require.t中)、ファイル名、および(権威)でチラッtest suiteを経由して、ランタイム・輸入の場合に静かです。

それでは、Rakudoがどのように動作するかを見てみましょう:

予想したように、静的または動的なモジュール名を経由して、ランタイム・輸入

require main; 

または

require ::('main'); 

がない限りMAINを実行しません。それは両方ともis exportと宣言され、明示的にインポートされます。つまり、

それぞれ
require main <&MAIN>; 

require ::('main') <&MAIN>; 

。しかし

require 'main.pm6'; 

ファイル名を経由して

輸入はすぐMAINを実行します。実際に

、あなたが

require 'main.pm6' <&MAIN>; 

を経由して、適切なインポートを行う場合は、サブは2回実行されます。一度コンパイル・ユニット、およびランタイムが見て、任意のMAINを実行しているその仕事をして二度目をロードするときメインラインのスコープのsub。

Rakudoはファイル名の引数がの多かれ少なかれrequireを処理し、遭遇したサブMAINを含むメインラインを実行するようです。

これはではなく、と私は予想していた可能性があります。

+0

これはいくつかの良い情報です。メインラインコードにない限りMAINも実行されるとは思わないでしょう。つまり、実際には元々実行されていたファイルです。他のファイルからのものであれば、それは実行されません。それにはEVALFILEが含まれます。 –

+0

@briandfoy:暫定的には、 'EVALFILE'が' MAIN'を実行しなくても、 'EVALFILE'の名前付きパラメータ?新しいサブ' RUNFILE'?sh形式の 'SOURCEFILE' ?...) – Christoph

+0

うん、トリッキー。しかし、もしそれが一方的に、あるいは他のことに行くと文書化されていれば、それは別の何かをしても、私はそれを扱うことができます。しかし、たぶんあなたはファイルを文字列に読み込み、その文字列を評価することができます。 –

関連する問題