Nas*_*ser 4 wolfram-mathematica
我发现有时能够使用自己的本地符号创建一个本地模块(在父模块内)是有用的,这只需要父模块使用的小任务.当模块变大时,这很有用,并且没有充分的理由在模块外部创建较小的辅助函数,因为这些辅助函数确实只需要由一个父模块使用和使用.
这是一个愚蠢的例子,有一个模块,里面有一个辅助模块
foo[x_] := Module[{r},
r = Module[{y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
y /. sol
];
x^r
]
Run Code Online (Sandbox Code Playgroud)
但是上面的问题是,内部模块的局部变量可能与父模块的局部变量发生冲突,因为当我执行以下操作时,M笔记本使内部模块局部变量变红,这告诉我我在做什么我不应该这样做:(我不想一直担心检查我是否使用内部模块的唯一本地符号,这与用作父模块的本地符号的符号不同,毕竟,它是应该是本地的.并且在这种情况下也必须提出不同的符号名称)
foo[x_] := Module[{r, y=0},
r = Module[{y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
y /. sol
];
x^r
]
Run Code Online (Sandbox Code Playgroud)
请注意红色,根据帮助,它是多个上下文中的局部范围冲突或阴影.

(M需要使用更好的颜色,难以在许多颜色之间产生差异,所有颜色都是红色).

(我认为这是一个阴影战争)无论哪种方式,它告诉我我不应该这样做,即使我在使用它时没有看到这种构造有任何问题.
在这个例子中父模块局部变量'y'的值没有通过调用内部模块'r'而被覆盖,这是好的.
同样,我不想在foo之外创建一个函数,因为这个小任务仅由foo []使用,不需要将它移动到Global上下文.
当然,我总是可以写:
foo[x_] := Module[{r, y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
r = y /. sol;
x^r
]
Run Code Online (Sandbox Code Playgroud)
但我只是举个例子,这是针对大型模块的,它有助于将模块内部的任务分解为甚至几个较小的任务.内部函数,内部函数是我之前在其他语言中使用的东西,例如Ada/Pascal,它具有这种结构,可用于大型程序.
我的问题是:只是想与专家联系,如果我使用上述内容是否安全,即使M给我这个红色警告?如果有什么我需要担心这样做
谢谢,
是的,Modules 只要您不丢失它们,就可以安全地在嵌套中使用相同的变量.Mathematica将在该模块中定义的每个变量Module视为本地.局部变量是,并编号为.您可以使用以下示例自行检查:Temporaryvariable$ModuleNumber
Module[{x = 1},
Print[HoldForm@x, " = ", x]
Module[{x = 2},
Print[HoldForm@x, " = ", x]
Module[{x = 3},
Print[HoldForm@x, " = ", x]
];
Print[HoldForm@x, " = ", x]
];
Print[HoldForm@x, " = ", x]
]
(*Output
x$4576 = 1
x$4577 = 2
x$4578 = 3
x$4577 = 2
x$4576 = 1
*)
Run Code Online (Sandbox Code Playgroud)