2009-09-18 78 views
3

我需要一個函數,它將一個符號的名稱作爲一個字符串並返回是否已經定義了該符號。函數ValueQ已關閉,但函數名稱返回False。此外,它需要符號而不是字符串。Mathematica中「定義」的等效

例子:

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 <> "]"] || 
       [email protected][s] =!= Symbol || 
       ToExpression["Attributes[" <> s <> "]"] =!= {} || 
       ToExpression["DownValues[" <> s <> "]"] =!= {} || 
       ToExpression["SubValues[" <> s <> "]"] =!= {} 

希望有一個漂亮的解決方案。 PS:感謝Pillsy指出需要檢查DownValues和SubValues。

2

我覺得名字應該做的伎倆:

名稱[「字符串」]給出匹配 串符號的 名稱的列表。

如果Names [「foo」]返回{},那麼應該沒有foo的定義,否則應該返回{「foo」}。 「定義」 所以你的功能可能會做如:

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

至少對於符號,因爲這並不能爲「7」的工作,因爲7是不是象徵。您可以單獨處理這種情況,例如使用NumberQ。

此外,您可以使用Symbol從字符串中生成符號(用於自動生成符號)和定義來檢查符號的定義。

符號[「名稱」]是指具有 指定名稱的符號。

定義[symbol]打印爲符號給定的 定義。

編輯:不是看什麼名稱的回報更好,NameQ [「名稱」]告訴你,如果一個給定的名稱存在。儘管如此,它仍然沒有告訴你該符號是否有明確的定義,只是提到了它。

+1

哦,真好!儘管名稱[「7」]失敗。另外,如果你提到一個符號x,那麼Names [「x」]將表明它已被定義,即使它實際上沒有定義。 – dreeves 2009-09-18 19:53:44

+0

你說得對。我不確定是否有任何方法可以知道某個符號是否有明確的定義,或只有提及的符號。定義[foo]告訴你這一點,但我認爲不能自動使用。 – Joren 2009-09-18 20:02:37

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) =!= {})];