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なのでそんなに速くないはずですが、それでもこの大差です。これはちょっとひどいですね。