我在一个带有一些参数的循环中编写了执行从(未来)客户端接收的函数的代码。将其命名为func(将其命名)。
在函数内部,客户端通常在相同的变量中生成表达式(通过GetUncertainty - 每个变量必须在使用前清除)。要做到这一点,简单的想法是使用Block。之后,执行一个代码来处理函数外的di和i。因此,di和i必须是全局的(可能更多,它是灵活的)。
顺便说一句,我知道效率不高,但效率不是问题。func[v_, a_, r_] :=
(V = v; A = a; R = r;
Block[{V, A, R},i = V A + A 10 + R 100; di = GetUncertainty[i, {V, A, R}];] ;
Print[di])
问题是客户必须手动重置变量。这意味着函数参数不能是V_,A_,R_,否则块中的vars将被值替换。我无法以任何其他方式克服这个问题。
类似问题中的另一个问题。如果我有 vars = {V,A,R,DR},然后 阻止[vars,.. code ..],抛出错误,它不是list.whereas Block [{V,A,R,DR},.. code ..]有效。如何克服这个?
感谢。
答案 0 :(得分:1)
很难解开你想要做的事情,但最好的方法可能是简单地从不为需要在某些上下文中用作纯符号的符号赋值。那你甚至不需要Block []。
func[v_, a_, r_] := (
i = V A + A 10 + R 100;
di = GetUncertainty[i, {V, A, R}];
Print[di /. {V->v,A->a,R->r])
使用Caps开始使用自己的符号名称时,会因为存在与内置符号冲突的风险而感到不满。
另请注意,有一个专用网站mathematica.stackexchange.com
答案 1 :(得分:0)
如果我了解您的应用程序,您需要的是正式符号。这些是具有属性Protected
的一组符号,因此不会意外地为它们分配值。他们可以输入例如正式资本A的 Esc $A
Esc 然后您可以使用ReplaceAll
(简称/.
),因为乔治显示替换您的期望值。
您的代码将是这样的:
func[v_, a_, r_] :=
Module[{i, di},
i = \[FormalCapitalV] \[FormalCapitalA] + \[FormalCapitalA] 10 + \[FormalCapitalR] 100;
di = GetUncertainty[i, {\[FormalCapitalV], \[FormalCapitalA], \[FormalCapitalR]}];
di /. {\[FormalCapitalV] -> v, \[FormalCapitalA] -> a, \[FormalCapitalR] -> r}
]
这看起来很可怕但是在笔记本中看起来像这样:
我添加了Module
来说明如何正确地本地化i
和di
等实用符号,但这个特别简单的函数也可以在没有它们的情况下编写:
关于“vars = {V,A,R,DR}
然后Block[vars , ..code.. ]
”的第二个问题在此处得到解答:How to set Block local variables by code?