使用相同的本地符号将模块放在另一个模块中是否安全?

时间:2011-12-22 06:59:28

标签: wolfram-mathematica

我发现有时能够使用自己的本地符号创建一个本地模块(在父模块内)很有用,这只需要父模块使用一个小任务。当模块变大时,这很有用,并且没有充分的理由在模块外部创建较小的辅助函数,因为这些辅助函数确实只需要由一个父模块使用和使用。

这是一个愚蠢的例子,里面有一个模块,里面有一个辅助模块

foo[x_] := Module[{r},

  r = Module[{y, sol},
    sol = First@Solve[y^2 + 3 y + 2 == 0];
    y /. sol
    ];

  x^r

  ]

但是上面的问题是,内部模块的局部变量,可能与父模块的局部变量冲突,因为当我做以下操作时M笔记本使内部模块局部变量变红,这告诉我我正在做一些我不应该做的事情:(我不想一直担心我是否在使用内部模块的唯一本地符号,这与用作父模块的本地符号的符号不同,毕竟,它应该是本地的。并且在这种情况下也必须提出不同的符号名称)

foo[x_] := Module[{r, y=0},

  r = Module[{y, sol},
    sol = First@Solve[y^2 + 3 y + 2 == 0];
    y /. sol
    ];

  x^r

  ]

注意红色,根据帮助,它是多个上下文中的局部范围冲突或阴影。

enter image description here

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

enter image description here

(我认为这是一个阴影警告)无论哪种方式,它告诉我我不应该这样做,即使我在使用它时没有看到这种构造有任何问题。

本例中父模块局部变量'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

  ]

但我只是举个例子,这是针对大型模块的,它有助于将模块内部的任务分解为甚至几个较小的任务。内部函数,内部函数是我之前在其他语言中使用的东西,例如Ada / Pascal,它具有这种结构,可用于大型程序。

我的问题是:只是想与专家联系,如果我可以安全使用上述内容,即使M给我这个红色警告?如果有什么我需要担心这样做

感谢,

2 个答案:

答案 0 :(得分:8)

是的,只要您不丢失它们,就可以安全地在嵌套Modules 中使用相同的变量。 Mathematica将Module中定义的每个变量视为模块的本地变量。局部变量为Temporary,编号为variable$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
*)

答案 1 :(得分:2)

据我所知,这是检测的一个小问题。