我需要一个函数,它将符号的名称作为字符串,并返回是否已定义该符号。函数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。
答案 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
中)。这是一个相当强大的函数,可以检查DownValues
和SubValues
:
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]] === ""]