import:外部ライブラリ内の関数呼び出し


Q:ルジャンドル関数など, Gnuplotの組み込み関数にはない関数を使いたいのですが?

A:Version.5.0からは,gnuplotの標準組み込みにない関数のライブラリを作成し,以下 のようにimportコマンドを用いて, ユーザー定義関数として呼び出すplugin機能が導入されました.
import ユーザー定義関数名 from "ライブラリ名:関数名"
このライブラリの例は,demo_plugin.so がソースの demo/plugin ディレクトリにあります.所望する関数は,demo_plugin.c に追記して, makeし直すのが最も簡単です.ただし,demo_plugin.so しか作成されませんの で,実際には
mv demo_plugin.so  func_plugin.so
などと適当な名前に変更するのがよいかもしれません.demo_plugin.so 以外の新しいpluginを(ここではexfunc_plugin.soとしましょう)作成するには, Makefile.amを編集して,Makefile.inを作成しなおさなければなりません. それには開発版のprepare(これは4.7-20140723に付 属のもの)コマンドを利用するのが近道です.以下に手順を示します.

関数の実装

さて,中身の問題ですが,関数をソースから書き起こすのは大変なので, GNU Sientific Library を利用することを考えます. Gnuplot の import に対する書式はdemo_plugin.c の雛形をそのまま使って, 次のようなgslの関数へのラッパーを作成すれば簡単に利用できます.
DLLEXPORT struct value gsl_Si(int nargs, struct value *arg, void *p)
{
  struct value r;
  double x, s;

  RETURN_ERROR_IF_WRONG_NARGS(r, nargs, 1);
  RETURN_ERROR_IF_NONNUMERIC(r, arg[0]);
  r.type = CMPLX;
  x = RVAL(arg[0]);
  if (x == 0 ) {
    r.v.cmplx_val.real = 0.0;
    return r;
  }
  s = gsl_sf_Si(fabs(x));
  r.v.cmplx_val.imag = FP_NAN;
  r.v.cmplx_val.real = x > 0.0 ? s: -s; 

  return r;
}
gslにない(みつけられなかった)エルミート多項式や,フレネル積分関数の ソース含んだものと,ついでに Makefile および demo/plugin/.depsにできる, exfunc_plugin_so-exfunc_plugin.Po (環境依存します:これは Vine 6.3 x86_64) を参考に置いておきます.
exfunc_plugin.cMakefile exfunc_plugin_so-exfunc_plugin.Po
Vine 6.3 XF86_64 と 32bitのplamo 4.7 (名前を gnuplot_plugin.soとしています)で作成した実 物も置いておきます.gsl.so と gslcblas.so が必須です.
exfunc_plugin.sognuplot_plugin.so

使用例

exfunc_plugin.soをカレントに置いて,テストスクリプト demo_exfunc.pltを実行した例(wxt)を示します.