相当于Mathematica中的“已定义”

时间:2009-09-18 19:39:42

标签: wolfram-mathematica utilities

我需要一个函数,它将符号的名称作为字符串,并返回是否已定义该符号。函数ValueQ已关闭但函数名称返回False。此外,它需要符号而不是字符串。

示例:

defined["N"] --> True (predefined function N)
defined["x"] --> False
x = 7;
defined["x"] --> True (x is now defined)
defined["7"] --> True (7 is a number)
f[x_] := 2x
defined["f"] --> True (f has DownValues)
g[x_][y_] := x+y
defined["g"] --> True (g has SubValues)

PS:感谢Pillsy指出需要检查DownValues和SubValues。

4 个答案:

答案 0 :(得分:2)

我认为名字应该可以解决问题:

  

Names [“string”]给出了一个列表   匹配的符号名称   字符串。

如果Names [“foo”]返回{},那么foo应该没有定义,否则它应该返回{“foo”}。 因此,您的“定义”功能可以完成:

defined[str_] := Names[str] != {}

至少对于符号,因为这对“7”不起作用,因为7不是符号。您可以单独处理此案例,例如使用NumberQ。

此外,您可以使用Symbol从字符串中创建符号(对于自动生成符号很有用),使用“定义”来检查符号的定义。

  

符号[“name”]是指带符号   指定的名称。

     

定义[symbol]打印为   给出符号的定义。

编辑:比查看Names返回的内容更好,NameQ [“name”]告诉您是否存在给定名称。仍然没有告诉你符号是否有明确的定义,只是它已被提及。

答案 1 :(得分:2)

我拼凑了这个,这似乎有效:

defined[s_] := ToExpression["ValueQ[" <> s <> "]"] || 
               Head@ToExpression[s] =!= Symbol || 
               ToExpression["Attributes[" <> s <> "]"] =!= {} ||
               ToExpression["DownValues[" <> s <> "]"] =!= {} ||
               ToExpression["SubValues[" <> s <> "]"] =!= {}

希望有一个更漂亮的解决方案。

PS:感谢Pillsy指出需要检查DownValues和SubValues。

答案 2 :(得分:2)

您可以使用DownValues查看您是否拥有与某个符号相关联的“功能”。这适用于像

这样的定义
f[x_, y_] := x + y

g[3] = 72 * a;

它不适用于像

这样的异国情调
h[a_][b] = "gribble";

但是大多数人都不会认为这是定义一个函数。如果要检查是否存在函数定义,则需要将名称转换为表达式(并确保在执行时将其包装在Hold中)。这是一个相当强大的函数,可以检查DownValuesSubValues

functionNameQ[name_String] := 
    With[{ hSymbol = ToExpression[name, InputForm, Hold] },
        MatchQ[hSymbol, Hold[_Symbol]] &&
            ((DownValues @@ hName) =!= {} || (SubValues @@ hName) =!= {})];

答案 3 :(得分:1)

defined[str_] := Not[ToString[FullDefinition[str]] === ""]