【问题标题】:How to check if a symbol is already defined如何检查符号是否已定义
【发布时间】:2019-08-13 10:48:58
【问题描述】:

这个问题在 2011 年 (Checking if a symbol is defined) 之前已经被问过,但是,从那时起,Mathematica 已经有了几个主要版本。

因此,我想知道是否有更简单的解决方案来检查某个符号是否已被定义(以避免覆盖它)? ValueQ 显然有一些缺陷,其他答案为这样一个简单的问题提供了相当复杂的解决方案。

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    在什么情况下您会担心“覆盖它”。如果它是您定义的符号,您可以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"} *)
    

    【讨论】:

    • 假设我对笔记本及其定义的符号一无所知(我也不能假设任何符号都受到保护,因为我不知道笔记本的内容)。我现在希望自己定义一些符号,但不想覆盖已经定义的符号。我同意一种可能的解决方案是使用上下文。然而,这并没有回答原来的问题。
    • @Qubit 添加了示例来解决您的用例。
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多