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)
我们可以看到在任何评估发生之前test2在Global`上下文中创建的内容.
我认为最简单的方法是在符号上使用显式上下文:cc`x = 1.