【发布时间】:2019-08-13 10:48:58
【问题描述】:
这个问题在 2011 年 (Checking if a symbol is defined) 之前已经被问过,但是,从那时起,Mathematica 已经有了几个主要版本。
因此,我想知道是否有更简单的解决方案来检查某个符号是否已被定义(以避免覆盖它)? ValueQ 显然有一些缺陷,其他答案为这样一个简单的问题提供了相当复杂的解决方案。
【问题讨论】:
这个问题在 2011 年 (Checking if a symbol is defined) 之前已经被问过,但是,从那时起,Mathematica 已经有了几个主要版本。
因此,我想知道是否有更简单的解决方案来检查某个符号是否已被定义(以避免覆盖它)? ValueQ 显然有一些缺陷,其他答案为这样一个简单的问题提供了相当复杂的解决方案。
【问题讨论】:
在什么情况下您会担心“覆盖它”。如果它是您定义的符号,您可以Protect它。
Remove[x];
x = 1;
Protect[x];
x = 2
(* Set::wrsym: Symbol x is Protected. *)
如果您担心阴影,请使用Contexts。
更新
symbols = Names["Global`*"];
NotebookEvaluate[FileNameJoin[{NotebookDirectory[], "test.nb"}], InsertResults -> False];
Complement[Names["Global`*"], symbols]
(* {"xyzzy"} *)
【讨论】: