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

Sza*_*lcs 12 parsing symbols wolfram-mathematica

如果我们逐个评估这些行,x将在上下文中创建cc.

Begin["cc`"];
x = 1;
End[]
Run Code Online (Sandbox Code Playgroud)

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

(Begin["cc`"];
x = 1;
End[])
Run Code Online (Sandbox Code Playgroud)

然后x将创建Global.尽管有以下印刷cc`:

(Begin["cc`"];
Print[$Context];
End[])
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是什么? 我的猜测是,上下文在解析阶段才起作用,而不是评估.

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

Bre*_*ion 15

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

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

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

(Print["first"];
 test2;
 Print["last"])
Run Code Online (Sandbox Code Playgroud)

第一个打印:

first
Name: test1 Context: Global`
last
Run Code Online (Sandbox Code Playgroud)

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

Name: test2 Context: Global`
first
last
Run Code Online (Sandbox Code Playgroud)

我们可以看到在任何评估发生之前test2Global`上下文中创建的内容.

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

  • 另一个有时有用的选项是使用ToExpression在*评估期间进行一些新的解析*:(开始["cc`"];使用[{s = ToExpression ["x"]},s = 1];结束[] ;) (3认同)