シベリア鉄道で6日もいたら退屈するだろうと思って、数年前からYAPCのたびに興味が湧くだけで手を付けずに来ていた Perl 6 に入門してみようと思っていました。この前の宣言通り、このブログは Perl 6 で動くようにしようと思っています。ので、それへ向けた準備をこの旅行中にやりました。

Perl 6 の機能の概要をあつかった記事は結構あるけど、正直書いてみんとわからん、と言うこともあり、また書き出すとこういうときはどうするんだ、という疑問が出てきたり、ということで、やってみてよかったです。何となく稲中の「左手卓球」的な気もしなくはないですが!

で、Perl 6 と web 、っていう関連で既存の実装はないかな?と思って調べてみたら、 november というwikiがありました。CGIとして動作する前提っぽいので若干使い回しがつらそうな感じだったので、ここは Plack 的な仕組みを Perl 6 で実装してみたらどうなるんだろう?というのにチャレンジしてみました。miyagawaさんも「盗め」と言ってたので、実践です。かなり大雑把というか、とりあえず動け!という感じでやったので、実装を省略していたりしますが、何となく動くところまでできました。

https://github.com/lopnor/p6-plackdo

いちばんかんたんなapp.p6sgi(とかってに拡張子を考えたw)はこんな感じ。

use v6;

sub (%env) {
    return
        200,
        ( Content-Type => 'text/plain' ),
        ( 'Hello, Rakudo!' )
    ;
}
# vim: ft=perl6

これをperl6 plackdup.pl –app app.p6sgiとして起動するとhttp://127.0.0.1:5000/にウェブサーバーが立ち上がってくれます。plackdup.plはこんな感じ。

#!/usr/bin/env perl6
use v6;
BEGIN {@*INC.unshift('lib')}

use Plackdo::Runner;

sub MAIN (
    :$handler = 'Standalone',
    :$app = 'app.p6sgi',
    :$env = 'development',
    *%rest
) {
    Plackdo::Runner.new(
        handler => $handler,
        app => $app,
        env => $env,
    ).run(%rest);
}

sub MAINで引数を指定すると、Getopt::Long的なことをしてくれて、usageまで出してくれるのはびっくりしました。

コードを書く手順としては、とりあえずrakudoについてきたUsingPerl6-draft.pdfを読んで、あとはrakudo/tをgrepしてコード例を探す、novemberの書き方をパクる、でした。意外にテストコードはあるけど未実装でrakudo-spectestを飛ばしてるのもあるので要注意です。テストはprove -e perl6 test.tとして実行。use Test;すればだいたい普段の書き方ができる。もっとテスト書かないとですね。

ということで引き続き進めていこうと思います。間違い指摘、こう書いた方がいいよ等、ぜひアドバイスください。