28.2 文字列変数のマクロ置換 (Substitution macros)

文字 @ は、コマンドライン上でその文字列変数の値への置換を行なうのに使 われます。文字列変数の値としての文は、複数の単語からなることも可能です。 これにより文字列変数をコマンドラインマクロとして使うことが可能になりま す。この機能により展開できるのは文字列定数のみで、文字列を値に取る数式 を使うことはできません。 例:


     style1 = "lines lt 4 lw 2"
     style2 = "points lt 3 pt 5 ps 2"
     range1 = "using 1:3"
     range2 = "using 1:5"
     plot "foo" @range1 with @style1, "bar" @range2 with @style2

この @ 記号を含む行は、その入力時に展開され、それが実際に実行されると きには次のように全部打ち込んだ場合と同じことになります。


     plot "foo" using 1:3 with lines lt 4 lw 2, \
          "bar" using 1:5 with points lt 3 pt 5 ps 2

関数 exists() はマクロの評価に関して有用でしょう。以下の例は、C が安全にユーザ定義変数の名前に展開できるかどうかをチェックします。


     C = "pi"
     if (exists(C)) print C," = ", @C

マクロの展開は、単一引用符内、または二重引用符内では行なわれませんが、 逆引用符 (`) 内ではマクロ展開されます。

マクロの展開は、gnuplot が新しいコマンド行を見たときに非常に早い段階で gnuplot が処理し、そしてただ一度だけそれを行います。よって、


    A = "c=1"
    @A

のようなコードは正しく実行しますが、以下のような行はだめです。それは、 マクロの定義が同じ行にあるため展開に間に合わないからです。


    A = "c=1"; @A   # will not expand to c=1

中カッコ内でのマクロの展開は、ループの実行前に行われます。すなわち、 A 自身をループ内で変更しても @A は常に元の A の値として作用します。

コマンドを完成させて実行するには、コマンド evaluate も有用でしょう。

竹野茂治@新潟工科大学
2019-05-30