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
它不等于任何东西(甚至它本身))。