像 Mathematica 中那样进行记录的问题已经在几个地方讨论过,例如Mathematica 中的结构数据类型?.
所有这些方法的问题在于,人们似乎失去了执行以下操作的能力:
对每个参数进行特定的额外检查,就像当一个参数这样做时x_?NumericQ
.
我的问题是:Mathematica 中有没有一种方法可以创建记录或结构,同时能够对各个元素使用上面的检查?
我正在尝试确定一种使用方法,因为我厌倦了使用 10 个参数调用函数(有时无法避免这一点),即使我尝试使每个函数非常具体,以最大限度地减少参数,有些函数只需要很多参数来完成特定的工作。
首先我展示一下我所知道的三种方法。
Method 1
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
优点:安全,就像我将符号“from”更改为其他内容一样,它仍然可以工作。正如下面的例子。
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
from=-1; (* By accident the symbol from was set somewhere. It will work*)
foo[p]
Method 2
Clear[p,foo];
foo[p_]:=Module[{},
Print[p];
Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"] = Pi;
foo[p]
优点:也安全,字符串是不可变的。不必担心“from”值发生变化。但是到处都有字符串不是太可读了吗?
Method 3
Clear[p,to,from];
foo[p_]:=Module[{},
Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to] = Pi;
foo[p]
缺点:如果任何符号“from”或“to”在某处被覆盖,将会导致问题,如
from=-4; (*accidentally the symbol from is assigned a value*)
foo[p]
所以。我认为方法(1)是最安全的。但现在我失去了这样做的能力:
foo[from_?NumericQ, to_?NumericQ] := Module[{},
Plot[Sin[x], {x, from, to}]
]
from = -Pi; to = Pi;
foo[from, to]
所以,我希望得到一个想法,能够将“记录”结合起来,但同时仍然能够对记录中的各个元素使用参数检查?或者这个问题对于 Mathematica 基于函数/规则的编程风格来说不是很好吗?
这是我希望 Mathematica 拥有的一件事,它是一个真实的记录,可以帮助管理和组织程序中使用的所有变量。