Frage

Ich brauche eine Funktion, die den Namen des symbols, das wie eine Zeichenkette und gibt zurück, ob das symbol bereits definiert ist.Die Funktion ValueQ ist in der Nähe, aber es gibt False zurück, für die Funktion von Namen.Auch, es braucht Symbole anstelle von Zeichenfolgen.

Beispiele:

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:Dank Pillsy für den Hinweis auf die Notwendigkeit zu prüfen, die für beide DownValues und SubValues.

War es hilfreich?

Lösung 2

Ich habe dies zusammengeschustert, die scheint zu funktionieren:

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

Hoffentlich gibt es eine schönere Lösung.

PS:Dank Pillsy für den Hinweis auf die Notwendigkeit zu prüfen, die für beide DownValues und SubValues.

Andere Tipps

Ich denke, die Namen sollten den trick tun:

Namen["string"] gibt eine Liste der Namen von Symbolen, die mit dem string.

Wenn Namen["foo"] returns {}, dann sollte es keine Definitionen für "foo", ansonsten sollte er zurückkehren, {"foo"}.Damit Sie Ihre Funktion der 'definierten' getan werden könnte wie:

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

Für die Symbole zu mindestens, denn dies funktioniert nicht bei "7", seit dem 7 ist nicht ein symbol.Sie könnten in diesem Fall behandeln separat, zum Beispiel mit NumberQ.

Auch, Sie können verwenden Sie Symbol, um ein symbol aus einem string (nützlich für die automatische generieren von Symbolen) und die Definition, um überprüfen Sie die Definitionen für ein symbol.

Symbol["name"] bezieht sich auf ein symbol mit die angegebenen Namen.

Definition[symbol] Drucke als Definitionen für ein symbol.

BEARBEITEN:Besser als zu schauen, was gibt Namen, NameQ["name"] informiert Sie, wenn ein name vorhanden ist.Immer noch nicht sagen, ob das symbol eine explizite definition, jedoch, nur, dass es erwähnt wurde.

Sie können verwenden DownValues um zu sehen, ob Sie "Funktionen" in Verbindung mit einem symbol an.Dies funktioniert für Definitionen wie

f[x_, y_] := x + y

oder

g[3] = 72 * a;

Es wird nicht Arbeit für exotische Dinge wie

h[a_][b] = "gribble";

aber die meisten Leute werden nicht denken, wie Sie eine Funktion definieren sowieso.Wenn Sie wollen zu überprüfen die für die Existenz der definition einer Funktion, die Sie brauchen, um zu konvertieren der name eines Ausdrucks (und machen sicher, es ist verpackt in Hold wenn Sie das tun!).Hier ist eine einigermaßen robuste Funktion, die prüft, ob DownValues und SubValues:

functionNameQ[name_String] := 
    With[{ hSymbol = ToExpression[name, InputForm, Hold] },
        MatchQ[hSymbol, Hold[_Symbol]] &&
            ((DownValues @@ hName) =!= {} || (SubValues @@ hName) =!= {})];
defined[str_] := Not[ToString[FullDefinition[str]] === ""]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top