0

我编写了执行从(未来)客户端接收到的函数的代码,在一个带有一些参数的循环中。将其称为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} ,那么 Block[vars , ..code.. ] 会抛出它不是列表的错误。而 Block[ {V,A,R,DR},。 .code..] 有效。如何克服这一点?

谢谢。

4

2 回答 2

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

于 2013-08-14T13:40:33.597 回答
0

如果我了解您的应用程序,您需要的是正式符号。这些是一组具有属性的符号,Protected因此它们不会被意外地分配一个值。它们可以用例如Esc$AEsc形式大写 A 输入。然后,您可以使用ReplaceAll(short form /.) 如乔治所示来替换您想要的值。

您的代码将是这样的:

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展示如何正确本地化实用程序符号,例如ianddi但是这个特别简单的函数也可以在没有它们的情况下编写:

在此处输入图像描述

您关于“ vars = {V,A,R,DR}then Block[vars , ..code.. ]”的第二个问题在这里得到解答:如何通过代码设置块局部变量?


专用 StackExchange 站点:
在此处输入图像描述

于 2013-08-14T22:59:34.550 回答