我需要一个函数作为字符串,需要一个符号的名称,并返回该符号是否已定义。该功能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和子值

有帮助吗?

解决方案 2

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

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

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

PS:由于Pillsy用于指出需要检查这两个DownValues和子值

其他提示

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

  

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

如果名称[ “foo” 的]返回{},则应该有FOO没有定义,否则它应该返回{ “foo” 的}。 所以,你的“定义”功能,可以这样做的:

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

有关至少符号,因为这不为“7”工作,因为7不为符号。你可以seperately处理这种情况,例如用NumberQ。

此外,可以用符号做一个符号出的字符串(用于自动生成符号有用)和定义的,以检查符号的定义。

  

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

     

定义[符号]打印作为   给定为一个符号定义。

修改:不是看什么名称的回报更好,NameQ [“名称”]告诉你,如果一个给定的名称存在。还是不告诉你,如果符号有一个明确的定义,虽然,只是它已经提到。

您可以使用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) =!= {})];
defined[str_] := Not[ToString[FullDefinition[str]] === ""]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top