题
我需要一个函数作为字符串,需要一个符号的名称,并返回该符号是否已定义。该功能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
当你这样做!)。下面是检查既DownValues
和SubValues
相当健壮功能:
functionNameQ[name_String] :=
With[{ hSymbol = ToExpression[name, InputForm, Hold] },
MatchQ[hSymbol, Hold[_Symbol]] &&
((DownValues @@ hName) =!= {} || (SubValues @@ hName) =!= {})];
defined[str_] := Not[ToString[FullDefinition[str]] === ""]
不隶属于 StackOverflow