Perl 6 中的模塊

Modules


Exporting and Selective Importing


is export


packages(包), subroutines(子例程), variables(變量), constants(常量) 和 enums(枚舉) , 通過(guò)在它們的名字后面添加 is export 特性來(lái)導(dǎo)出系奉。

unit module MyModule;
our $var is export = 3;
sub foo is export { ... };
constant $FOO is export = "foobar";
enum FooBar is export <one two three>;

# Packages like classes can be exported too
class MyClass is export {};

# If a subpackage is in the namespace of the current package
# it doesn't need to be explicitly exported
class MyModule::MyClass {};

就像所有的 traits 一樣, 如果應(yīng)用到子例程(routine)上, "is export" 應(yīng)該出現(xiàn)在參數(shù)列表的后面:

sub foo (Str $string) is export {...}

你可以給 is export 傳遞命名參數(shù)以組織要導(dǎo)出的符號(hào), 然后導(dǎo)入程序? (importer) 可以剔除和選擇導(dǎo)入哪一個(gè)。有 3 個(gè)預(yù)先定義好的標(biāo)簽: ALL, DEFAULT, MANDATORY(強(qiáng)制的)撒遣。

# lib/MyModule.pm
unit module MyModule;
sub bag        is export              { ... }
sub pants      is export(:MANDATORY)  { ... }
sub sunglasses is export(:day)        { ... }
sub torch      is export(:night)      { ... }
sub underpants is export(:ALL)        { ... }
# main.pl
use lib 'lib';
use MyModule;           #bag, pants
use MyModule :DEFAULT;  #the same
use MyModule :day;      #pants, sunglasses
use MyModule :night;    #pants, torch
use MyModule :ALL;      #bag, pants, sunglasses, torch, underpants

UNIT::EXPORT::*


表象之下, 其實(shí) is export 是把符號(hào)添加到 EXPORT 命名空間中的 UNIT 作用域包中拯钻。例如, is export(:FOO) 會(huì)把目標(biāo)添加到 UNIT::EXPORT::FOO 包中部凑。這正是 Perl 6 決定導(dǎo)入什么所做的参袱。

unit module MyModule;

sub foo is export         { ... }
sub bar is export(:other) { ... }

等價(jià)于:

unit module MyModule;

my package EXPORT::DEFAULT {
  our sub foo { ... }
}

my package EXPORT::other {
  our sub bar { ... }
}

多數(shù)時(shí)候, is export 足夠用了, 但是當(dāng)你想動(dòng)態(tài)生成要導(dǎo)出的符號(hào)時(shí), EXPORT 包就很有用了。例如:

# lib/MyModule.pm
unit module MuModule;

my package EXPORT::DEFAULT {
  for <zero one two three four>.kv -> $number, $name {
      for <sqrt log> -> $func {
          OUR::{'&' ~ $func ~ '-of-' ~ $name } := sub { $number."$func()" };
      }
  }
}
# main.pl
use MyModule;
say sqrt-of-four; #-> 2
say log-of-zero;  #-> -Inf

EXPORT


你可以用一個(gè) EXPORT 子例程導(dǎo)出任意符號(hào)盯漂。 EXPORT 必須返回一個(gè) Map, 在 map 里面鍵是符號(hào)名, 鍵值是想要的值集乔。符號(hào)名應(yīng)該包含(如果有的話(huà))關(guān)聯(lián)類(lèi)型去件。

class MyModule::Class { ... }

sub EXPORT {
  {
      '$var'      => 'one',
      '@array'    => <one two three>,
      '%hash'     => { one => 'two', three => 'four'},
      '&doit'     => sub { ... },
      'ShortName' => MyModule::class
  }
}
# main.pl
use lib 'lib';
use MyModule;
say $var;
say @array;
say %hash;
doit();
say ShortName.new;  #-> MyModule::Class.new

注意, EXPORT 不能聲明在包內(nèi), 因?yàn)槟壳暗?rakudo(2015.09) 好像把 EXPORT 當(dāng)作 compunit 的一部分而非包的一部分。

雖然 UNIT::EXPORT 包處理傳遞給 use 的命名參數(shù), 而 EXPORT sub 處理位置參數(shù)扰路。如果你把位置參數(shù)傳遞給 use, 那么這些參數(shù)會(huì)被傳遞給 EXPORT. 如果傳遞了位置參數(shù), 那么 module 就不再需要導(dǎo)出默認(rèn)符號(hào)了尤溜。你仍然可以伴隨著你的位置參數(shù), 通過(guò)顯式地給 use 傳遞 :DEFAULT 參數(shù)來(lái)導(dǎo)入它們。

# lib/MyModule

class MyModule::Class {}

sub EXPORT($short_name?) {
    {
      do $short_name => MyModule::Class if $short_name
    }
}

sub always is export(:MANDATORY) { say "works" }

#import with :ALL or :DEFAULT to get
sub shy is export { say "you found me!" }
# main.pl
use lib 'lib';
use MyModule 'foo';
say foo.new(); #MyModule::Class.new
always();      #OK   - is imported
shy();         #FAIL - won't be imported

發(fā)布模塊


如果你已經(jīng)寫(xiě)了一個(gè) Perl 6模塊, 你想把它分享到社區(qū), 我們會(huì)很高興地把它放到 Perl 6 模塊文件夾清單中汗唱。Perl 6 modules directory

現(xiàn)在, 你需要使用 git 對(duì)你的模塊進(jìn)行版本控制宫莱。

這需要你有一個(gè) Github 帳號(hào), 以使你的模塊能被從它的 Github 倉(cāng)庫(kù)中分享出去。

要分享你的模塊, 按照下面說(shuō)的做:

  • 創(chuàng)建一個(gè)以你的模塊命名的工程文件夾哩罪。 例如, 如果你的模塊是 Vortex::TotalPerspective , 那么就創(chuàng)建一個(gè)叫做 Vortex::TotalPerspective 的工程文件夾授霸。這個(gè)工程目錄的名字也會(huì)被用作 Github 倉(cāng)庫(kù)的名字。

  • 讓你的工程目錄看起來(lái)像這樣:

    Vortex-TotalPerspective/
    |-- lib
    |   `-- Vortex
    |       `-- TotalPerspective.pm
    |-- LICENSE
    |-- META.info
    |-- README.md
    `-- t
        `-- basic.t
    

    如果你的工程包含能幫助主模塊完成工作的其它模塊, 它們應(yīng)該被放到你的 lib 目錄中像這樣組織:

    
    lib
    `-- Vortex
        |-- TotalPerspective.pm
        `-- TotalPerspective
            |-- FairyCake.pm
            `-- Gargravarr.pm
    
    • README.md 文件是一個(gè) markdown 格式的文件, 它稍后會(huì)被 Github 自動(dòng)渲染成 HTML

    • 關(guān)于 LICENSE 文件, 如果你沒(méi)有其它選擇, 就是用和 Rakudo Perl 6 一樣的 LICENSE 把际插。僅僅把它的原始 license 復(fù)制/粘貼進(jìn)你自己的 LICENSE 文件中碘耳。

    • 如果你還沒(méi)有任何測(cè)試, 現(xiàn)在你可以忽略 t 目錄 和 basic.t 文件。關(guān)于如何寫(xiě)測(cè)試, 你可以看看其它模塊是怎么使用 Test 的框弛。它和 Perl'5 的 Test::More 很類(lèi)似藏畅。

    • 如果要文檔化你的模塊, 在你的模塊中使用 Perl 6 Pod 標(biāo)記。歡迎給模塊寫(xiě)文檔, 并且為了瀏覽的方便, 一旦 Perl 6 module directory(或其它網(wǎng)站) 開(kāi)始把 Pod 文檔渲染成 HTML, 寫(xiě)文檔尤為重要功咒。

    • 讓你的 META.info 文件看起來(lái)像這樣:

       {
              "name"        : "Vortex::TotalPerspective",
              "version"     : "0.1.0",
              "description" : "Wonderful simulation to get some perspective.",
              "author"      : "Your Name",
              "provides"    : {
                  "Vortex::TotalPerspective" : "lib/Vortex/TotalPerspective.pm"
              },
              "depends"     : [ ],
              "source-url"  : "git://github.com/you/Vortex-TotalPerspective.git"
          }
      

      關(guān)于選擇版本號(hào)的方案, 或許使用 "major.minor.patch" (查看 the spec on versioning 獲取詳細(xì)信息 )。如果版本號(hào)現(xiàn)在對(duì)你或你的用戶(hù)來(lái)說(shuō)不重要, 你可以給版本那兒放上一顆星(*)绞蹦。

      provides 一節(jié), 包含進(jìn)你的發(fā)布中提供的所有命名空間力奋。

      • 把你的工程放在 git 版本控制之下, 如果你還未這樣做。
      • 一旦你對(duì)你的工程滿(mǎn)意了, 在 Github 上為它創(chuàng)建一個(gè)倉(cāng)庫(kù)幽七。必要的話(huà), 查看 Github's help docs景殷。 你的 Github 倉(cāng)庫(kù)的名字應(yīng)該和你工程目錄的名字一樣。創(chuàng)建完 Githhub 倉(cāng)庫(kù)后, Github 會(huì)為你展示怎么配置你的本地倉(cāng)庫(kù)以獲悉你的 Github 倉(cāng)庫(kù)澡屡。
      • 把你的工程推送到 Github
      • 在 IRC 頻道找個(gè)人幫你展示怎么把你的模塊添加到ecosystem, 或者讓他們是否能替你添加猿挚。
      • pull 請(qǐng)求被接收之后, 等個(gè)把小時(shí)。如果你的模塊沒(méi)有出現(xiàn)在 http://modules.perl6.org/ , 請(qǐng)到 http://modules.perl6.org/log/update.log 翻看log 日志文件, 以查找是否有錯(cuò)誤驶鹉。

    就是這樣啦绩蜻! 感謝為 Perl 6 社區(qū)做貢獻(xiàn)!

    如果你想嘗試安裝你的模塊, 使用熊貓 panda 安裝工具, 這已經(jīng)包含在 Rakudo Perl 6 中了:

    panda install Vortex::TotalPerspective
    

    這會(huì)下載你的模塊到它自己的工作目錄(~/.panda), 在那兒創(chuàng)建 build, 并把模塊安裝到 ~/.perl6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末室埋,一起剝皮案震驚了整個(gè)濱河市办绝,隨后出現(xiàn)的幾起案子伊约,更是在濱河造成了極大的恐慌,老刑警劉巖孕蝉,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屡律,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡降淮,警方通過(guò)查閱死者的電腦和手機(jī)超埋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佳鳖,“玉大人霍殴,你說(shuō)我怎么就攤上這事∫傅撸” “怎么了繁成?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)淑玫。 經(jīng)常有香客問(wèn)我巾腕,道長(zhǎng),這世上最難降的妖魔是什么絮蒿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任尊搬,我火速辦了婚禮,結(jié)果婚禮上土涝,老公的妹妹穿的比我還像新娘佛寿。我一直安慰自己,他們只是感情好但壮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布冀泻。 她就那樣靜靜地躺著,像睡著了一般蜡饵。 火紅的嫁衣襯著肌膚如雪弹渔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天溯祸,我揣著相機(jī)與錄音肢专,去河邊找鬼。 笑死焦辅,一個(gè)胖子當(dāng)著我的面吹牛博杖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筷登,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剃根,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了前方?” 一聲冷哼從身側(cè)響起跟继,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤种冬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后舔糖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娱两,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年金吗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十兢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摇庙,死狀恐怖旱物,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卫袒,我是刑警寧澤宵呛,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站夕凝,受9級(jí)特大地震影響宝穗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜码秉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一逮矛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧转砖,春花似錦须鼎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至姓赤,卻和暖如春糖荒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背模捂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜘矢,地道東北人狂男。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像品腹,于是被迫代替她去往敵國(guó)和親岖食。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議舞吭。它實(shí)...
    香橙柚子閱讀 23,865評(píng)論 8 183
  • 2016-10-20 號(hào)更新泡垃。 源文件可以在 github 或 perl6.org上找到. General Rak...
    焉知非魚(yú)閱讀 977評(píng)論 0 0
  • 微信是現(xiàn)在國(guó)內(nèi)用的最多的app析珊,有8億多人在使用微信,這可是個(gè)龐大的數(shù)字∶镅ǎ現(xiàn)在不用微信忠寻,不會(huì)微信轉(zhuǎn)賬都會(huì)被人覺(jué)得o...
    楊榮鵬閱讀 365評(píng)論 0 4
  • 我是沐言媽?zhuān)矣卸氜忍辏绺缛θΓ妹命c(diǎn)點(diǎn)捐腿,是我心目中的“可圈可點(diǎn)”組合纵朋。 隨著點(diǎn)點(diǎn)一點(diǎn)點(diǎn)長(zhǎng)大,會(huì)懂得爭(zhēng)寵茄袖,搶玩具了...
    沐言的夢(mèng)想閱讀 475評(píng)論 3 1