2009-09-18 97 views
3

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

例子:

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和子值。

回答

2

我鹅卵石这个在一起,这似乎工作:

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

希望有一个漂亮的解决方案。 PS:感谢Pillsy指出需要检查DownValues和SubValues。

2

我觉得名字应该做的伎俩:

名称[“字符串”]给出匹配 串符号的 名称的列表。

如果Names [“foo”]返回{},那么应该没有foo的定义,否则应该返回{“foo”}。 “定义” 所以你的功能可能会做如:

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

至少对于符号,因为这并不能为“7”的工作,因为7是不是象征。您可以单独处理这种情况,例如使用NumberQ。

此外,您可以使用Symbol从字符串中生成符号(用于自动生成符号)和定义来检查符号的定义。

符号[“名称”]是指具有 指定名称的符号。

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

编辑:不是看什么名称的回报更好,NameQ [“名称”]告诉你,如果一个给定的名称存在。尽管如此,它仍然没有告诉你该符号是否有明确的定义,只是提到了它。

+1

哦,真好!尽管名称[“7”]失败。另外,如果你提到一个符号x,那么Names [“x”]将表明它已被定义,即使它实际上没有定义。 – dreeves 2009-09-18 19:53:44

+0

你说得对。我不确定是否有任何方法可以知道某个符号是否有明确的定义,或只有提及的符号。定义[foo]告诉你这一点,但我认为不能自动使用。 – Joren 2009-09-18 20:02:37

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) =!= {})];