gnuplotには、他の多くの言語が持っている内省能力は実際にはありません。実際、文字列と数値(少なくとも整数)は非常によく似た方法で処理されます。
print "1"+2 #prints 3
a=1
print "foo".a #prints foo1
これが内部でどのように実装されているのか正確にはわかりません。しかし、あなたが求めていることは、仕事に取り掛かるのが非常に難しいことです。
実際、gnuplotでの型チェックは不可能なので、最初の試み(変数が存在するかどうかのチェック)の方が賢明だと思います*。変数名を文字列として関数に渡すことができますが、問題は、値のハンドルがないように見えることです。すべてが失われたようです-しかし、待ってください、gnuplotにはeval
文字列が与えられたときにそれを評価するステートメントがあります。これは素晴らしいようです!残念ながら、これはステートメントであり、関数ではありません(したがって、関数で使用することはできません--argv!)。私が思いつくことができる最善の解決策は、を使用して評価できる式を返す関数を作成することeval
です。ここに行きます:
def exists_func(result,var)=sprintf("%s=exists('%s')?sprintf('%g',var):'NaN'",result,var,var)
これで、使用する場合は、接頭辞を付けるだけです。eval
a=3
eval exists_func("my_true_result","a")
print my_true_result #3
eval exists_func("my_false_result","b")
print my_false_result #NaN
これは少し穀物に反します。ほとんどのプログラミング言語では、おそらく次のようなことをしたいと思うでしょう。
my_true_result=exists_func(a)
しかし、残念ながら、そのフォームを機能させる方法がわかりません。
もちろん、ここでも常に同じことが起こりますeval
。信頼できない文字列でこの関数を使用しないでください。
*それが不可能かどうかは実際にはわかりませんが、機能させることができたことがありません
編集
上記の質問に対するあなたのコメントに応えて、私はこのような関数がもう少し直感的だと思います:
def fmt(x)=(x==x)?sprintf("%g",x):"NaN"
この関数を使用すると、「sentinal / default」の値はではNaN
なくなります"undefined"
が、それほど大きな違いはないようです...(実際、あなたが代わりに一緒に暮らすことをいとわないのであれば"nan"
)"NaN"
この関数はまったく必要ありsprintf
ません-問題なく動作します(IEEEによれば、これNaN
は(それ自体でさえ)何にも等しくないため、これは機能することに注意してください)。