Gnuplot::Builder 0.27をリリースした

先日、Gnuplot::Builder 0.27をリリースした。

今回のバージョンの目玉はなんといってもやはりGnuplot::Builder::Templateだろう。これは"正しい"gnuplotの構文を記憶したテンプレートオブジェクトを提供するモジュールで、今のところdatasetの"using"オプションと"every"オプションのテンプレートを用意している。

以前、gnuplotのusingの仕様がヒドいという話を書いたが、Templateを使えばだいぶマシになると思う。例えばこんな感じで使う。

use strict;
use warnings;
use feature "say";
use Gnuplot::Builder::Dataset;
use Gnuplot::Builder::Template qw(gusing gevery);

my $dataset = Gnuplot::Builder::Dataset->new_file("sample.dat");
$dataset->set(
    using => gusing(
        -x => 1, -xlow => 2, -xhigh => 3,
        -y => 4, -ylow => 5, -yhigh => 6
    ),
    every => gevery(
        -start_point => 1, -end_point => 50
    ),
    with => "xyerrorbars",
);
say "$dataset"; ## => 'sample.dat' using 1:4:2:3:5:6 every 1::1::50 with xyerrorbars

このように、gusing()関数に名前付き引数としてパラメータを渡すことができる。gusing()はGnuplot::Builder::JoinDictオブジェクトを返し、こいつはstringificationされる際に与えられたパラメータをきちんとした順番に並べ替えてからjoinしてオプション文字列を生成する。そのため、ユーザはどのパラメータをどこに置くべきかを考えずに済む。gevery()も同様である。

これまでGnuplot::Builderではgnuplotの文法仕様への依存がなるべく少なくなるように気をつけて作っていたが、そういう意味ではTemplateは比較的依存度が高いモジュールだと言える。特にgusing()は今後新たなプロットスタイルが追加されたらそれに追従して更新しなければいけないだろう。そのため、後方互換性と拡張可能性のバランスを取るのが非常に難しい。いろいろ考えたが、結局ハイフン("-")から始まるキーは予約されているものとし、新しく追加するキーも必ずハイフンから始めるようにルールを定めた。