为什么不使用Begin []工作?

时间:2011-10-27 14:35:36

标签: parsing wolfram-mathematica symbols

如果我们逐一评估这些行,则会在上下文x中创建cc

Begin["cc`"];
x = 1;
End[]

但是,如果我们一起评估它们,

(Begin["cc`"];
x = 1;
End[])

然后x将创建Global。尽管有以下打印cc`

(Begin["cc`"];
Print[$Context];
End[])

这种行为的原因是什么?我的猜测是,上下文只在解析阶段有效,而不是评估。

用例:我想创建一个调色板Button,它将定义一些符号(如果它们尚不存在),在“私有”上下文中以避免与全局变量发生冲突。 执行此操作的首选方法,除了将所有定义放在包文件中并从调色板加载它们之外? (我想保持调色板自包含。)

3 个答案:

答案 0 :(得分:15)

符号(及其上下文)是在解析时创建的,而不是在评估时创建的。如果我们使用$NewSymbol,我们可以看到这有效:

$NewSymbol=Print["Name: ",#1," Context: ",#2]&;

Print["first"];
test1;
Print["last"]

(Print["first"];
 test2;
 Print["last"])

第一个打印:

first
Name: test1 Context: Global`
last

因为单元格中的每一行都被视为单独的输入。第二个使用括号强制所有三行被视为一个输入并打印

Name: test2 Context: Global`
first
last

我们可以看到test2是在Global`上下文中发生任何评估之前创建的。{/ p>

我认为最简单的方法是在符号上使用明确的上下文:cc`x = 1

答案 1 :(得分:2)

对于您的第二个问题,我建议您使用this我的答案,它有效地自动执行您概述的步骤(使用ParseTimeNameSpaceWrapper功能)。可能需要更多工作才能使其更加强大,但这可能是一个起点。我有时会自己使用这些东西。

答案 2 :(得分:0)

仅供参考:

(Begin["cc`"]; Evaluate[Symbol["x"]] = 1; End[])

cc`x
1