Domanda

Ho bisogno di una funzione che prende il nome di un simbolo come una stringa e restituisce se quel simbolo è già definito. La funzione ValueQ è vicina ma restituisce False per i nomi delle funzioni. Inoltre, richiede simboli anziché stringhe.

Esempi:

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: grazie a Pillsy per aver sottolineato la necessità di verificare sia i DownValues ??che i SubValues.

È stato utile?

Soluzione 2

L'ho messo insieme, che sembra funzionare:

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

Speriamo che ci sia una soluzione più carina.

PS: grazie a Pillsy per aver sottolineato la necessità di verificare sia i DownValues ??che i SubValues.

Altri suggerimenti

Penso che i nomi dovrebbero fare il trucco:

  

Nomi [" string "] fornisce un elenco di   nomi di simboli che corrispondono a   stringa.

Se Nomi [" foo "] restituisce {}, allora non ci dovrebbero essere definizioni per foo, altrimenti dovrebbe restituire {" foo "}. Quindi la tua funzione "definita" potrebbe essere eseguita come:

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

Almeno per i simboli, perché questo non funziona per " 7 " ;, poiché 7 non è un simbolo. È possibile gestire questo caso separatamente, ad esempio con NumberQ.

Inoltre, puoi usare Simbolo per creare un simbolo da una stringa (utile per generare automaticamente simboli) e Definizione per controllare le definizioni di un simbolo.

  

Il simbolo [" name "] si riferisce a un simbolo con   il nome specificato.

     

La definizione [simbolo] viene stampata come   definizioni fornite per un simbolo.

MODIFICA : meglio che guardare cosa restituisce Nomi, NomeQ [" nome "] ti dice se esiste un determinato nome. Tuttavia non ti dice se il simbolo ha una definizione esplicita, solo che è stato menzionato.

Puoi utilizzare DownValues ?? per vedere se hai " funzioni " associato a un simbolo. Funzionerà con definizioni come

f[x_, y_] := x + y

o

g[3] = 72 * a;

Non funzionerà per cose esotiche come

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

ma la maggior parte delle persone non lo considererà comunque come definizione di una funzione. Se vuoi verificare l'esistenza di una definizione di funzione, devi convertire il nome in un'espressione (e assicurati che sia racchiuso in Hold quando lo fai!). Ecco una funzione ragionevolmente solida che controlla sia DownValues ?? che SubValues ??:

functionNameQ[name_String] := 
    With[{ hSymbol = ToExpression[name, InputForm, Hold] },
        MatchQ[hSymbol, Hold[_Symbol]] &&
            ((DownValues @@ hName) =!= {} || (SubValues @@ hName) =!= {})];
defined[str_] := Not[ToString[FullDefinition[str]] === ""]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top