Wolfram mathematica 相当于;定义为;在数学中

Wolfram mathematica 相当于;定义为;在数学中,wolfram-mathematica,utilities,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_] :

我需要一个函数,它将符号的名称作为字符串,并返回该符号是否已定义。函数
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指出需要同时检查DownValue和SubValue。

我认为名字应该起作用:

名称[“字符串”]给出了 与符号匹配的符号的名称 绳子

如果Names[“foo”]返回{},那么应该没有foo的定义,否则它应该返回{“foo”}。 因此,您的函数“已定义”可以按如下方式执行:

defined[str_] := Names[str] != {}
至少对于符号,因为这不适用于“7”,因为7不是符号。您可以单独处理此情况,例如使用NumberQ

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

符号[“名称”]指带有 指定的名称

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


编辑:与查看返回的名称相比,NameQ[“name”]更好地告诉您是否存在给定的名称。但是,仍然没有告诉您符号是否有明确的定义,只是提到了它。

我将其拼凑起来,这似乎很有效:

defined[s_] := ToExpression["ValueQ[" <> s <> "]"] || 
               Head@ToExpression[s] =!= Symbol || 
               ToExpression["Attributes[" <> s <> "]"] =!= {} ||
               ToExpression["DownValues[" <> s <> "]"] =!= {} ||
               ToExpression["SubValues[" <> s <> "]"] =!= {}
defined[s]:=ToExpression[“ValueQ[“s”]”]||
Head@ToExpression[s] =!=符号| |
ToExpression[“Attributes[“s”]”]=!={} ||
ToExpression[“DownValues[“s”]”]=!={} ||
ToExpression[“子值[“s”]”]=!={}
希望有一个更好的解决方案


PS:感谢Pillsy指出需要检查下行值和子值。

您可以使用
下行值
查看是否有与符号关联的“函数”。这将适用于以下定义:

f[x_, y_] := x + y

它不适用于像这样的异国情调

h[a_][b] = "gribble";
但大多数人不会认为这是定义函数。如果要检查函数定义是否存在,则需要将名称转换为表达式(并确保在执行此操作时将其包装在
Hold
中!)。这里有一个相当健壮的函数,它可以检查
下值
子值

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

哦,太好了!但对于名称[“7”]它失败。此外,如果你提到一个符号x,那么名称[“x”]将表明它已定义,即使它实际上没有定义。你是对的。我不确定是否有任何方法可以知道一个符号是否有明确的定义,或者它只是被提及。定义[foo]告诉你这一点,但我认为不能自动使用。这个解决方案有副作用,它会评估函数。e、 g.
f[x]:=Print[x]
定义的[f[“Hello”]]
。看看。@Rohit:这是一个关于停止的问题,而不是我的解决方案。假设你有f[x]:=Modue[{},如果你想知道f[someX]是否定义了,那么你想知道结果是Sin还是某物未定义,如果你能做到(一般来说)如果不调用Boody知道的非常复杂的条件,即使在不确定之前完成计算,您也可以解决停止问题。如果我想成为动态的,如何将Cos转换为“Cos”?
functionNameQ[name_String] := 
    With[{ hSymbol = ToExpression[name, InputForm, Hold] },
        MatchQ[hSymbol, Hold[_Symbol]] &&
            ((DownValues @@ hName) =!= {} || (SubValues @@ hName) =!= {})];
defined[str_] := Not[ToString[FullDefinition[str]] === ""]