Definition
"weiß", wie ein Wert für ein Symbol definiert wurde: mit Set
oder SetDelayed
. Aber wie? Nachdem ein Wert für ein Symbol zugewiesen wurde, gibt es keinen Unterschied für den Bewerter, wie er zugewiesen wurde: mit Set
oder SetDelayed
. Dies kann durch die Funktion OwnValues
veranschaulicht werden, die immer Definitionen mit dem Head
RuleDelayed
zurückgibt. Wie Definiton
erhält diese Information?
OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a]
gibt {HoldPattern[a] :> 3}
anstelle von {HoldPattern[a] -> 3}
, aber Definition[a]
zeigt, was man erwarten kann. Wahrscheinlich wird diese Definition intern in Form von Rule
gespeichert, wird aber in RuleDelayed
by OwnValues
umgewandelt, um die Auswertung der r.h.s der Definition zu unterdrücken. Diese Hypothese widerspricht meinem ursprünglichen Verständnis, dass es keinen Unterschied zwischen den Werten gibt, die von Set
und SetDelayed
zugewiesen wurden. Wahrscheinlich werden solche Definitionen in verschiedenen Formen gespeichert: Rule
und RuleDelayed
entsprechend, aber sind aus der Sicht des Evaluators gleichwertig.
Es ist interessant zu sehen, wie MemoryInUse[]
von der Art der Definition abhängt.
Im folgenden Experiment habe ich den Kernel von Mathematica 5.2 in einer interaktiven Sitzung ohne FrontEnd verwendet. Mit den Kernen von Mathematica 6 und 7 werden unterschiedliche Ergebnisse erzielt. Ein Grund dafür ist, dass in diesen Versionen Set
überlastet ist Standardmäßig .
Als Erstes evaluiere ich $HistoryLength=0;
, damit DownValues
für In
und Out
keine Auswirkungen auf meine Ergebnisse hat. Aber selbst wenn $HistoryLength
auf 0 gesetzt ist, wird der Wert von In[$Line]
für die aktuelle Eingabezeile immer noch gespeichert und nach Eingabe einer neuen Eingabe entfernt. Dies ist wahrscheinlich der Grund, warum das Ergebnis der ersten Auswertung von MemoryInUse[]
immer von dem zweiten abweicht.
Hier ist, was ich habe:
Mathematica 5.2 für Studenten: Microsoft Windows Version
Copyright 1988-2005 Wolfram Research, Inc.
- Terminalgrafiken initialisiert -
In [1]: = $ HistoryLength = 0;
In [2]: = SpeicherInUse []
Aus [2] = 1986704
In [3]: = MemoryInUse []
Aus [3] = 1986760
In [4]: = SpeicherInUse []
Aus [4] = 1986760
In [5]: = a = 2;
In [6]: = MemoryInUse []
Aus [6] = 1986848
In [7]: = MemoryInUse []
Aus [7] = 1986824
In [8]: = MemoryInUse []
Aus [8] = 1986824
In [9]: = a: = 2;
In [10]: = MemoryInUse []
Aus [10] = 1986976
In [11]: = MemoryInUse []
Aus [11] = 1986952
In [12]: = MemoryInUse []
Aus [12] = 1986952
In [13]: = a = 2;
In [14]: = MemoryInUse []
Aus [14] = 1986848
In [15]: = MemoryInUse []
Aus [15] = 1986824
In [16]: = SpeicherInUse []
Aus [16] = 1986824
Man kann sehen, dass die Definition von a=2;
MemoryInUse[]
um 1986824-1986760 = 64 Bytes erhöht. Ersetzen durch die Definition a:=2;
erhöht MemoryInUse[]
um 1986952-1986824 = 128 Bytes. Und die letztere Definition wird durch die frühere ersetzt MemoryInUse[]
auf 1986824 Bytes. Dies bedeutet, dass verzögerte Definitionen 128 Bytes mehr benötigen als sofortige Definitionen.
Natürlich beweist dieses Experiment nicht meine Hypothese.
Auf die vollständige Definition eines Symbols kann über undokumentierte new-in-8 Symbole Language'ExtendedDefinition
und Language'ExtendedFullDefinition
zugegriffen werden. Zitieren Oleksandr Rasputinov :
"Wenn jemand neugierig ist, sind Language'ExtendedDefinition
und Language'ExtendedFullDefinition
analog zu Definition
und FullDefinition
, erfassen aber die Definition eines Symbols so, wie es in einem anderen Kernel reproduziert werden kann. Zum Beispiel defs = Language'ExtendedFullDefinition[sym]
gibt ein Language'DefinitionList
-Objekt zurück Die Syntax zum Wiederherstellen der Definition ist sehr unregelmäßig: Language'ExtendedFullDefinition[] = defs
, wobei defs
ein Language'DefinitionList
ist Beachten Sie, dass Language'ExtendedFullDefinition
die Option ExcludedContexts
übernimmt, Language'ExtendedDefinition
dagegen nicht. "
Information
ruft Definition
auf, und eine Ablaufverfolgung auf Definition
(oder FullDefinition
) zeigt nichts an. Ich muss annehmen, dass dies eine Low-Level-Funktion ist, die auf Daten außerhalb der *Values
-Tabellen zugreift. Vielleicht behält es eine Kopie der ursprünglichen Definitionsausdrücke, wie sie zu dieser Zeit geparst wurden.
Tags und Links wolfram-mathematica