OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a]
дает {HoldPattern[a] :> 3}
вместо {HoldPattern[a] -> 3}
, но Definition[a]
показывает, что можно ожидать.Вероятно, это определение хранится внутри в виде Rule
, но преобразуется в RuleDelayed
на OwnValues
для подавления оценки относительной влажности определения.Эта гипотеза противоречит моему первоначальному пониманию, что нет никакой разницы между значениями, присвоенными Set
и SetDelayed
.Вероятно, такие определения хранятся в разных формах: Rule
и RuleDelayed
соответственно, но эквивалентны с точки зрения оценщика.
Интересно посмотреть, как MemoryInUse[]
зависит от вида определения.
В следующем эксперименте я использовал ядро Mathematica 5.2 в интерактивной сессии без FrontEnd.С ядрами Mathematica 6 и 7 можно получить разные результаты.Одной из причин этого является то, что в этих версиях Set
по умолчанию перегружен .
Прежде всего я оцениваю $HistoryLength=0;
для наличия DownValues
для In
и Out
переменные, не влияющие на мои результаты.Но кажется, что даже когда $HistoryLength
установлен в 0, значение In[$Line]
для текущей строки ввода все еще сохраняется и удаляется после ввода нового ввода.Вероятно, это причина того, что результат первой оценки MemoryInUse[]
всегда отличается от второй.
Вот что я получил:
Mathematica 5.2 для студентов: версия Microsoft Windows
Авторские права 1988-2005 Wolfram Research, Inc.
- Инициализирована графика терминала -
In [1]: = $ HistoryLength = 0;
In [2]: = MemoryInUse []
Out [2]= 1986704
In [3]: = MemoryInUse []
Out [3] = 1986760
In [4]: = MemoryInUse []
Out [4] = 1986760
In [5]: = a = 2;
In [6]: = MemoryInUse []
Out [6] = 1986848
In [7]: = MemoryInUse []
Out [7] = 1986824
In [8]: = MemoryInUse []
Out [8] = 1986824
In [9]: = a: = 2;
In [10]: = MemoryInUse []
Out [10] = 1986976
In [11]: = MemoryInUse []
Out [11] = 1986952
In [12]: = MemoryInUse []
Out [12] =1986952
В [13]: = a = 2;
В [14]: = MemoryInUse []
Out [14] = 1986848
В [15]: = MemoryInUse []
Out [15] = 1986824
In [16]: = MemoryInUse []
Out [16] = 1986824
Можно видетьчто определение a=2;
увеличивает MemoryInUse[]
на 1986824-1986760 = 64 байта.Замена его на определение a:=2;
увеличивает MemoryInUse[]
на 1986952-1986824 = 128 байтов.И замена последнего определения на прежние возвращает MemoryInUse[]
к 1986824 байта.Это означает, что отложенные определения требуют на 128 байт больше, чем непосредственные определения.
Конечно, этот эксперимент не подтверждает мою гипотезу.