【发布时间】:2011-09-09 02:58:08
【问题描述】:
关于在 Mathematica 中制作唱片的问题已经在少数地方讨论过,例如 Struct data type in Mathematica?。
所有这些方法的问题在于,一个人似乎失去了做
对每个参数进行特定的额外检查,例如 x_?NumericQ。
我的问题是:在 Mathematica 中是否有办法制作记录或结构,但又能够对单个元素使用上述检查?
我正在尝试使用一种方法,因为我厌倦了调用带有 10 个参数的函数(有时无法避免这种情况),即使我尝试使每个函数都非常具体,以最小化参数的数量,有些函数只需要很多参数就可以完成特定的工作。
首先我展示我知道的三种方法。
方法一
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
优点:安全,就像我将符号“从”更改为其他符号一样,它仍然可以工作。如下例。
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]
方法二
Clear[p,foo];
foo[p_]:=Module[{},
Print[p];
Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"] = Pi;
foo[p]
优点:也安全,字符串是不可变的。不必担心“来自”值的变化。但是到处都有字符串是不是太可读了?
方法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 拥有的一件事,它是帮助管理和组织程序中使用的所有变量的真实记录。
【问题讨论】:
-
在这个问题中有一些关于模拟结构/记录类型的讨论:What is the difference between Mathematica Rules and the objects returned by GraphEdit。