3

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

4

4 回答 4

3

我拼凑起来,这似乎工作:

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

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

PS:感谢 Pillsy 指出需要同时检查 DownValues 和 SubValues。

于 2009-09-18T19:50:04.777 回答
2

我认为名称应该可以解决问题:

Names["string"] 给出与字符串匹配的符号名称列表.

如果 Names["foo"] 返回 {},则不应有 foo 的定义,否则应返回 {"foo"}。所以你的函数“定义”可能会这样完成:

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

至少对于符号,因为这不适用于“7”,因为 7 不是符号。您可以单独处理这种情况,例如使用 NumberQ。

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

Symbol["name"] 引用具有指定名称的符号。

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

编辑:比查看 Names 返回的内容更好,NameQ["name"] 会告诉您给定名称是否存在。尽管如此,仍然没有告诉您该符号是否有明确的定义,只是提到了它。

于 2009-09-18T19:47:29.393 回答
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) =!= {})];
于 2009-09-19T02:23:56.260 回答
1
defined[str_] := Not[ToString[FullDefinition[str]] === ""]
于 2018-12-30T08:16:31.253 回答