Perl6とXslateの関係

Xslateのデフォルトテンプレート構文であるKolonは、Perl5とPerl6からいくつかの特徴を借りてきています。そこで、KolonのPerl6ライクな構文をちょっと紹介します。なお、以下のコードは直接端末にコピー&ペーストで実行できます。実行はRakudo Starをビルドしたディレクトリで行ってください。

まず、四則演算はだいたいどの言語でも共通なので省略するとして、ビット演算子が特徴的です:

# type it on your shell
# bitwise and:
xslate -e '<: 0x01 +| 0x10 :>'
# => 17
./perl6 -e 'say 0x01 +| 0x10'
# => 17
# remove a bit flag ($a) from 0x03
xslate -e '<: my $a = 0x01; 0x03 +& +^$a :>'
# => 2
./perl6 -e 'my $a = 0x01; say 0x03 +& +^$a'
# => 2

"<: ... :>"で囲ってsayを取り除くと同じ結果になることが分かると思います。

ちょっと変わった二項演算子として、maxとminがあります:

# type it on your shell
# min/max
xslate -e '<: 10 min 30 :>'
# => 10
./perl6 -e 'say 10 min 30'
# => 10
# min/max are chainable
xslate -e '<: 10 max 20 max 30 :>'
# => 30
./perl6 -e 'say 10 max 20 max 30'
# => 30

メソッド呼び出しや無名関数も似ています:

# type it on your shell
# reduce()
xslate -e '<: [1, 2, 3].reduce(-> $a, $b { $a + $b }) :>'
# => 6
./perl6 -e 'say [1, 2, 3].reduce(-> $a, $b { $a + $b })'
# => 6
# map()
xslate -e '<: { a => 1, b => 2 }.keys().sort().join(", ") :>'
# => a, b
./perl6 -e 'say { a => 1, b => 2 }.keys().sort().join(", ")'
# => a, b

いかがでしょうか。実際には、KolonのなかでPerl6ライクなのは上記くらいですが、雰囲気は味わえますね。

ところで、上記の./perl6というのは前述したとおりRakudo StarというPerl6の処理系ですが、その実行速度をXslateと比べると…

time xslate -e '<: "Hello, world!" :>'
# => Hello, world!
#
# real    0m0.142s
# user    0m0.120s
# sys     0m0.009s
# pure perl mode:
time XSLATE=pp xslate -e '<: "Hello, world!" :>'
# => Hello, world!
#
# real    0m0.148s
# user    0m0.130s
# sys     0m0.015s
time ./perl6 -e 'say "Hello, world!"'
# => Hello, world!
#
# real    0m1.132s
# user    0m1.047s
# sys     0m0.079s

Xslateのコンパイラはpure Perlなのでそんなに速くないはずですが、それでもこの大差です。これはちょっとひどいですね。