『Perl6入門』入門

Vieno
2010-12-09

私はまだPerl6を学び始めて日は浅いのですが、これから独学でPerl6に挑戦しようという読者さん向けに、まずは何から始めれば良いのか?という指針を紹介して行こうと思います。Perl6は他の言語と違い、書籍どころか入門サイトすらほとんど無いような状態なので、途方に暮れる無駄な時間を短縮しようという方針ですね。

コーディング環境

何はともあれ、言語問わずソースコードを書く際にはエディタが必要です。この記事ではUnix系の環境で主に使われているEmacsとVimについての紹介をしようと思います。
Emacsでは古くから使われているPerl5向けのメジャーモードとしてcperl-modeがありますが、このcperl-mode、実はPerl6に対応していたりするのです(もちろん古いバージョンでは非対応ですが)。ソースコードの中に"use v6;"という一文が含まれているか、拡張子が"*.p6"のファイルを開いてcperl-modeに移行するとPerl6のソースコードと解釈してパースしてくれます。ただこのcperl-modeのPerl6モード(?)はまだ完璧ではなく、一部の演算子や変数名を上手くパースできずに色がぐちゃぐちゃになってしまうことがあります。具体的にはReduce Metaoperator(演算子を角括弧で括ったもの)を使うと、それより後ろが素敵な色合いになったりします。他にも「座標をメンバ変数として保持しよう!」と "$.y"なんて変数名を付けると大変なことになります。
一方Vimの方ですが…私はEmacsユーザなので知りません>< というワケにもいかないので、VimでPerl6を書いている知り合いに聞いてみました。どうやらVim 7.3からは標準でPerl6用のモードが付属しているらしいです。シンタックスハイライトも普通に使えるとのこと。これでPerl6を書く準備が整ったわけですね!

ドキュメント

次は、実際にコードを書く前に読むオススメのドキュメントの紹介です。残念ながらPerl6は日本ではまだメジャーではないようで、日本語のドキュメントどころか公式ドキュメントの和訳すらほとんど見つからない状態です。これからもっとドキュメントが増えていくことを願うばかりですね。ちなみに以下に挙げるものも含めて多くのドキュメントはPerl5話者を対象としています。

Perl6 Advent Calendar

言わずと知れた本家のAdvent Calendarです。新たに導入された愉快な新機能を平易な英語で解説してくれています。サンプルコードも分かりやすく上質な記事ばかりなので、最初に読むドキュメントとしては最良だと言えるでしょう。私は英語力が皆無なので読むのに時間がかかる上に解釈も怪しいですが、逆に言えば私程度でも読める英語だということです。この辺り、原文の執筆者の非英語圏への配慮が伝わってきて嬉しいですね。

Perl 5 to 6

名前の通り、Perl5から6への変更点をトピック毎に纏めてあります。こちらも割と簡単な英語で読みやすいと思います。私含む有志で運営しているPerl6勉強会では、このドキュメントを読みつつ、必要に応じて後で紹介するSynopsisを参照するという手法をとっています(といっても数日前に第一回が開催されたばかりですが) 。

Using Perl6

Rakudo Starの/docsディレクトリ以下に入っているPDFファイルです。入門書的な内容で、これを読みながらREPLで実験するのに丁度良い感じです。興味のあるセクションだけでも目を通しておくと良いと思います。

Synopsis

最後はラスボス、Perl6の仕様書です。こちらの英語は上の2つほど簡単ではありませんが、仕様書だけあってPerl6の厳密な挙動を知ることが出来ます。まだDraftになっている部分もありますが、現時点ではこれが公式の仕様になっています。実はPerl6に関しての公式資料はいくつかあるのですが、RFCなど古いものは全て役に立たないと思った方が良いです。今はとりあえずこのSynopsisを読んでおけば問題無いでしょう。ちなみに現行のRakudo StarはこのSynopsisを全て満たしているわけではないので注意しましょう。

REPL

[/articles/advent-calendar/2010/perl6/7:title=7日の記事]で取り上げられていましたが、実際にRakudo Starと戯れる際にはREPLを多用します。中でもオブジェクトの所属しているクラス名を返す".WHAT"メソッドには何度もお世話になると思うので、あらかじめ使い方を把握しておきましょう(と言っても単なるメソッド呼び出しですが…)。Perl6ではちょっとした表記の違いやコンテキストの違いで解釈が大きく変わるので、詰まった時には".WHAT"しまくるのがベターです。

> (1 + 1).WHAT
Int()
> (1 / 1).WHAT
Rat()
> {}.WHAT
Hash()
> {...}.WHAT
Block()

こんなふうに。

Twitter

@uasiさんの[/articles/advent-calendar/2010/perl6/8:title=記事]でも触れられていましたが、Perl6に関する疑問を解決するには、Twitterが便利です。実際私も@uasiさんや@carlmasakさんには随分お世話になりました。Twitterは負荷の分散が自動で最適化される(つまり手が空いてる人が好きに答える)ので、あまり気負う必要がないのが良い所ですね。#Perl6タグさえ付けていれば、私も答えられる範囲で答えたいと思います。