Wolfram mathematica 局部变量和块使用

Wolfram mathematica 局部变量和块使用,wolfram-mathematica,block,Wolfram Mathematica,Block,我编写的代码执行它从(未来)客户机接收的函数,在一个带有一些参数的循环中。将称之为func(命名它) 在函数内部,客户机通常在相同的变量中生成表达式(通过GetUnderstance-使用前必须清除每个变量)。要做到这一点,最简单的方法是使用Block。之后,将执行一个代码,在函数外部处理di和i。因此,di和i必须是全局的(可能会有更多,它是灵活的) 顺便说一句,我知道这不是效率,但效率不是问题 func[v_, a_, r_] := (V = v; A = a; R = r; Bloc

我编写的代码执行它从(未来)客户机接收的函数,在一个带有一些参数的循环中。将称之为func(命名它)

在函数内部,客户机通常在相同的变量中生成表达式(通过GetUnderstance-使用前必须清除每个变量)。要做到这一点,最简单的方法是使用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])
问题是客户端必须手动重置VAR。这意味着函数参数不能是V、A、R,否则块中的变量将被值替换。我没有以任何其他方式克服这一点

类似问题中的另一个问题。如果我有 vars={V,A,R,DR},然后 块[vars,…code..]抛出错误,说明它不是列表。而块[{V,a,R,DR},…code..]工作正常。如何克服这个问题


谢谢

很难解释你想做什么,但最好的方法可能是永远不要给需要在某些上下文中用作纯符号的符号赋值。那么你甚至不需要块[]

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])
顺便说一句,当你冒着与内置符号冲突的风险时,用大写字母开始你自己的符号名称是不可取的


请注意,还有一个专门的网站mathematica.stackexchange.com

如果我了解您的应用程序,您需要的是正式符号。这是一组具有属性
Protected
的符号,这样就不会意外地给它们赋值。它们可以用Esc
$A
Esc表示正式大写字母A。然后,您可以使用george所示的
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}
  ]
这在这里看起来很可怕,但在笔记本中看起来是这样的:

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}
  ]

我包括了
模块
,以说明如何正确地本地化实用程序符号,如
I
di
,但这个特别简单的函数也可以在没有它们的情况下编写:

关于“
vars={V,A,R,DR}
然后
Block[vars,…code..]
”的第二个问题在这里得到了回答:


专用StackExchange站点: