Frage zu Definition und Werten von Symbolen

8

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?

%Vor%     
Alexey Popkov 07.05.2011, 05:17
quelle

3 Antworten

6

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.

    
Alexey Popkov 07.05.2011 11:16
quelle
4

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. "

    
Alexey Popkov 08.01.2014 10:50
quelle
3

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.

    
Mr.Wizard 07.05.2011 06:14
quelle

Tags und Links