如果我们逐一评估这些行,则会在上下文x
中创建cc
。
Begin["cc`"];
x = 1;
End[]
但是,如果我们一起评估它们,
(Begin["cc`"];
x = 1;
End[])
然后x
将创建Global
。尽管有以下打印cc`
:
(Begin["cc`"];
Print[$Context];
End[])
这种行为的原因是什么?我的猜测是,上下文只在解析阶段有效,而不是评估。
用例:我想创建一个调色板Button
,它将定义一些符号(如果它们尚不存在),在“私有”上下文中以避免与全局变量发生冲突。 执行此操作的首选方法,除了将所有定义放在包文件中并从调色板加载它们之外? (我想保持调色板自包含。)
答案 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