2016-11-24 50 views
5

下面是一個簡短的Perl 6程序,聲明MAIN子例程。我應該只看到輸出,如果我直接執行該程序:如果文件是必需的,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它從程序中,我看不到輸出:

$ perl6 -I. -e 'use main' 

但是,如果我用require,我得到的輸出:

$ 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:沒有要求的文件擴展名,它沒有找到該文件。 –

回答

-1

故事梗概文件不是真相的來源,並且在大多數地方通常是過時的。

您使用/ require的方式也可以改變模塊加載方式。 -M不採用'使用xxx'代碼路徑,並且使用文件名而不是模塊名稱也會改變事情。需要注意的是零排放論壇「use'-ES模塊與主並具有輸出顯示了https://github.com/ugexe/zef/blob/master/bin/zef

+0

但是Zef :: CLI的'MAIN'被導出... – Christoph

+0

你說什麼記錄?在當前的文檔中,它說明了主要應該做什麼以及它應該如何行動? –

+0

我不是說它的記錄,我只是解釋什麼存在 – ugexe

2

首先,讓我們來看看是如何require應該表現:

按照(非權威性)design documents

可替換地,文件名可被直接提到的,其中安裝了一個包是有效的匿名到當前詞法作用域,並且可以僅通過任何全局名稱的模塊安裝來訪問:

只有明確提到的名字纔可以被導入。爲了保護詞法墊的運行時間神聖性,它可能不會被require修改。

a)該編譯單元直接調用,而不是由被要求由另一個編譯單元[:

在具有S06

此調用組合當且僅當被執行。 ..]

我的理解是,不會顯式導入未顯式導入主線詞法作用域的子MAIN

可悲的是,user documentation是安靜的通過文件名,並在(權威的)快速瀏覽test suite(特別是S11-modules/require.t)輸入運行的情況下,也沒擦出產生一個答案,雖然我只是可能會錯過它。

現在,讓我們來看看Rakudo的行爲:

正如預期的那樣,輸入通過靜態或動態模塊名稱運行

require main; 

require ::('main'); 

將不會運行MAIN,除非它被宣佈爲is export並明確導入,即

require main <&MAIN>; 

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

分別。通過文件名

進口然而

require 'main.pm6'; 

會立即運行MAIN

事實上,如果你通過

require 'main.pm6' <&MAIN>; 

做一個適當的導入子將被執行兩次:一次加載編譯單元,而當運行時,它的工作的前瞻性和運行任何MAIN第二次時在主線範圍內。

Rakudo顯然對待require與文件名稱參數或多或少像EVALFILE並執行其主線,包括它遇到的任何sub MAIN

這就是不是我所期望的,可能只是一個錯誤。

+0

這是一些很好的信息,我也不會指望MAIN運行,除非它在主線代碼。也就是說,實際上在最初運行的文件中。如果它來自任何其他文件,則不應運行。包括EVALFILE。 –

+0

@briandfoy:暫時同意:如果'EVALFILE'不再執行'MAIN',那麼可能應該有一個替代方案(對EVALFILE命名的參數?一個新的子RUNFILE?一個sh風格的'SOURCEFILE' ?...) – Christoph

+0

是的,棘手。但是,如果有文件證明它可以以某種方式進行,那麼即使它做了一些不同的事情,我也可以使用它。但是,也許你可以將一個文件讀入一個字符串,並對該字符串進行評估。 –

相關問題