Perl Hackers Hub

第39回Perl 6の歩き方―15年越しでリリースされた新バージョン(3)

(1)こちら⁠2)こちらから。

Perl 6のエコシステム

Perl 6のプログラムが少し書けるようになったら、次にやることは自分でモジュールを書いて再利用できる形にまとめてみることです。モジュールを書いてみることで、⁠これはどうやって書くの?」⁠これとこれの違いは?」などの疑問が自然にわき、Perl 6を習得するスピードが増すはずです。

ここではPerl 6のモジュール管理のしくみ、モジュールのインストール方法、そしてモジュールの作り方を説明します。

ecosystemでモジュール管理

Perl 6にはPerl 5でのCPANのようなすべてのモジュールがアップロードされる場所はありませんが、各モジュールの置いてある場所をhttps://github.com/perl6/ecosystemにて一元管理し、インデックスを作っています。モジュールのインストール時にはこのインデックスを参照のうえ、ダウンロードしてインストールします。

インデックスへの新たなモジュールの追加はGitHub上でのPull Requestで受け付けており、人間味の溢れる管理となっています。

pandaでモジュールのインストール

モジュールのインストールには先述したpandaを使います。インストール方法も先述しましたが、もう一つ試しにHTTP::UserAgentをインストールして使ってみましょう。

インストール
$ panda install HTTP::UserAgent
実行
$ perl6 -MHTTP::UserAgent -e \
  'HTTP::UserAgent.new.get("http://perl6.org") \
  .status-line.say'
200 OK

インストール可能なモジュールの一覧はhttps://modules.perl6.org/にあります。

はじめてのモジュール作成

さて、いよいよ自分でモジュールを作ってみます。

ディレクトリ構成

Perl 6で再利用可能なモジュールを書くときの一般的なディレクトリ構成は次のようになります。

$ tree
  .
  ├── LICENSE
  ├── META6.json
  ├── README.md
  ├── lib
  │   └── Hello.pm6
  └── t
      └── 01-basic.t

lib以下にモジュール、t以下にテストを配置します。上記の場合は、Helloモジュールになります。Hello::Worldというモジュールを追加する場合は、lib/Helloディレクトリを作り、lib/Hello/World.pm6というファイルに書いていきます。

もし必要ならbinディレクトリを作り、そこに実行ファイルを配置します。

META6.jsonはメタ情報を書く重要なファイルです。モジュール自身のリポジトリURL、依存モジュールなどを書きます。

http://doc.perl6.org/language/modulesに詳しい解説がありますので、こちらも参照してください。

開発

lib/*.pm6にどんどん実装を書いていきましょう。合わせてテストもt/*.tに書いていきます。

テストの書き方と実行のしかたについて簡単に触れます。Rakudoには標準でTestというモジュールが入っており、これを使います。

たとえばHelloモジュールにgreetという関数を定義した場合、テストは次のようになります。

t/01-basic.t
use v6;
use Test;
use Hello;

is greet("Shoichi"), "Hello, Shoichi";

done-testing;

use TestTestモジュールをロードし、is A, BでAとBが同じであることをテストし、最後にdone-testingでテストの終わりを示しています。

Testモジュールの出力はTAPと呼ばれる形式ですので、テストの実行はPerl 5のツールであるproveの力を借りると便利です。proveはPerl 5がインストール済みであれば、すでに入っているはずです。

-eを使いperl6で実行することを指定しテストを走らせる
$ prove -e 'perl6 -Ilib' t/
t/01-basic.t .. ok
All tests successful.
Files=1, Tests=1, 2 wallclock secs (...)
Result: PASS

新たにt/02-test.tなどのテストを追加した場合も、上記コマンドでtディレクトリにあるすべてのテストを実行できます。

リリース

モジュールが完成したら、それを世界中の人に使ってもらえるようにリリースしましょう。リリースと言っても、先述したようにecosystemにPull Requestを送るだけです。

Pull Requestを送る前に、META6.jsonsource-urlを確認してください。source-urlからモジュールの場所を判断しているので、とても重要です。

確認できたらecosystemのMETA.listにあなたのMETA6.jsonのURLを追加し、Pull Requestを送りましょう。おそらく1日もしないうちにPerl 6コミュニティの方々がマージしてくれるはずです。

マージされれば、あなたのモジュールを、世界中の誰もが、

$ panda install Your::Module

でインストールできます。

さらに学ぶためのリソース

Perl 6について説明してきましたが、本稿で説明できたのはPerl 6のほんの一部です。最後に、さらに学ぶためのリソースを紹介します。

Perl 6入門

Perl 6入門は、Perl 6の全体像をすばやくつかむことを目的に書かれたものです。オリジナルは英語で、これはその日本語版です。

Perl 6 Documentation

Perl 6 DocumentationはPerl 6の公式ドキュメントです。特に「Language Reference & Tutorials」以下の記事を一通り読めば、Perl 6の言語的特徴が理解できるでしょう。

Perl 6 Design Documents

先述したようにPerl 6は仕様です。その仕様書が、まさにこのPerl 6 Design Documentsです。ある機能をどういう意図で取り入れようとしたかなども書かれており、非常に興味深く読めます。

なお、ここに載っているすべての機能をRakudoはまだ実装していないことに注意してください。

roast

先ほどの「Perl 6 Design Documents」には自然言語(英語)で仕様が書かれているため、ある実装が仕様に準拠しているかどうかを調べるのは至難の業です。そこで作られたのがテストケースの集まりroastです。roastをどれだけパスするかで、その実装がPerl 6の実装たり得るかを判断します。

roastは、Perl 6の実際のコード例を探すうえで極めて有用です。Perl 6で何かわからないことが出てきた場合には、このroastをローカルにダウンロードして全文検索することをお勧めします。たとえば==>という記号に出会い、そのコード例を知りたいなら、

$ cd /path/to/roast
$ grep -r '==>' .
...
./S03-feeds/basic.t: @a ==> @b;

$ vim ./S03-feeds/basic.t

のようにgrepで全文検索して適当なファイルをピックアップし、そのファイルを詳しく見てみるとよいでしょう。

まとめ

15年の時を経て、2015年のクリスマスにリリースされたPerl 6について説明してきました。この記事を読んでPerl 6に興味を持った人は、ぜひ実際にご自身でPerl 6を書き、そのおもしろさを味わってください。

さて、次回の執筆者は柴崎優季さんで、テーマは「Perlでの開発に動的な型制約を導入する」です。

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.130

2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8

  • 特集1
    イミュータブルデータモデルで始める
    実践データモデリング

    業務の複雑さをシンプルに表現!
  • 特集2
    いまはじめるFlutter
    iOS/Android両対応アプリを開発してみよう
  • 特集3
    作って学ぶWeb3
    ブロックチェーン、スマートコントラクト、NFT

おすすめ記事

記事・ニュース一覧